diff --git a/README.md b/README.md index ced8487..8759add 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,17 @@ For maximum performance when methods or fields are accessed repeatedly, the meth access.invoke(someObject, addNameIndex, "Awesome McLovin"); ``` +Iterate all fields: + +```java + FieldAccess access = FieldAccess.get(SomeClass.class); + for(int i = 0, n = access.getFieldCount(); i < n; i++) { + access.set(instanceObject, i, valueToPut); + } + } + +``` + ## Visibility ReflectASM can always access public members. An attempt is made to define access classes in the same classloader (using setAccessible) and package as the accessed class. If the security manager allows setAccessible to succeed, then protected and default access (package private) members can be accessed. If setAccessible fails, no exception is thrown, but only public members can be accessed. Private members can never be accessed. diff --git a/src/com/esotericsoftware/reflectasm/FieldAccess.java b/src/com/esotericsoftware/reflectasm/FieldAccess.java index 2fad277..feb7838 100644 --- a/src/com/esotericsoftware/reflectasm/FieldAccess.java +++ b/src/com/esotericsoftware/reflectasm/FieldAccess.java @@ -1,4 +1,3 @@ - package com.esotericsoftware.reflectasm; import java.lang.reflect.Field; @@ -14,6 +13,9 @@ import static org.objectweb.asm.Opcodes.*; public abstract class FieldAccess { private String[] fieldNames; + + //added + private Class[] fieldTypes; public int getIndex (String fieldName) { for (int i = 0, n = fieldNames.length; i < n; i++) @@ -32,6 +34,31 @@ public abstract class FieldAccess { public String[] getFieldNames () { return fieldNames; } + + //added + public Class[] getFieldTypes() { + return fieldTypes; + } + + //added + public Class getFieldType(String fieldName) { + return getFieldType(getIndex(fieldName)); + } + + //added + public int getFieldCount() { + return fieldTypes.length; + } + + //added + public Class getFieldType(int fieldIndex) { + return fieldTypes[fieldIndex]; + } + + //added + public String getFieldName(int fieldIndex) { + return fieldNames[fieldIndex]; + } abstract public void set (Object instance, int fieldIndex, Object value); @@ -87,8 +114,11 @@ public abstract class FieldAccess { } String[] fieldNames = new String[fields.size()]; - for (int i = 0, n = fieldNames.length; i < n; i++) + Class[] fieldTypes = new Class[fields.size()]; //added + for (int i = 0, n = fieldNames.length; i < n; i++) { fieldNames[i] = fields.get(i).getName(); + fieldTypes[i] = fields.get(i).getType(); //added + } String className = type.getName(); String accessClassName = className + "FieldAccess"; @@ -133,6 +163,7 @@ public abstract class FieldAccess { try { FieldAccess access = (FieldAccess)accessClass.newInstance(); access.fieldNames = fieldNames; + access.fieldTypes = fieldTypes; //added return access; } catch (Exception ex) { throw new RuntimeException("Error constructing field access class: " + accessClassName, ex);