Merge pull request #18 from gabrikid/master

FieldAccess with field types (Class<?>)
This commit is contained in:
Nathan Sweet 2013-12-03 04:21:03 -08:00
commit 8de97dfce6
2 changed files with 44 additions and 2 deletions

View File

@ -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.

View File

@ -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);