From 93dcc8e8100b85f1b8310616689572178b0e4c0f Mon Sep 17 00:00:00 2001 From: gabrikid Date: Thu, 28 Nov 2013 17:23:42 +0000 Subject: [PATCH 1/5] Create testfile.txt --- testfile.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 testfile.txt diff --git a/testfile.txt b/testfile.txt new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/testfile.txt @@ -0,0 +1 @@ +test From 4a0d80f993b35e137c44e3f1c92b6def8931a05c Mon Sep 17 00:00:00 2001 From: gabrikid Date: Fri, 29 Nov 2013 19:23:06 +0000 Subject: [PATCH 2/5] Delete testfile.txt --- testfile.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 testfile.txt diff --git a/testfile.txt b/testfile.txt deleted file mode 100644 index 9daeafb..0000000 --- a/testfile.txt +++ /dev/null @@ -1 +0,0 @@ -test From a02113269ce07446a4be0f209d9ad52874825892 Mon Sep 17 00:00:00 2001 From: gabrikid Date: Fri, 29 Nov 2013 19:30:42 +0000 Subject: [PATCH 3/5] Update FieldAccess.java --- .../reflectasm/FieldAccess.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/com/esotericsoftware/reflectasm/FieldAccess.java b/src/com/esotericsoftware/reflectasm/FieldAccess.java index 2fad277..c98bd16 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 fieldNames.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); From 030273bacf5587c956667f05ca0624d61d2edb61 Mon Sep 17 00:00:00 2001 From: gabrikid Date: Tue, 3 Dec 2013 11:44:39 +0000 Subject: [PATCH 4/5] Update FieldAccess.java --- src/com/esotericsoftware/reflectasm/FieldAccess.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/esotericsoftware/reflectasm/FieldAccess.java b/src/com/esotericsoftware/reflectasm/FieldAccess.java index c98bd16..feb7838 100644 --- a/src/com/esotericsoftware/reflectasm/FieldAccess.java +++ b/src/com/esotericsoftware/reflectasm/FieldAccess.java @@ -47,7 +47,7 @@ public abstract class FieldAccess { //added public int getFieldCount() { - return fieldNames.length; + return fieldTypes.length; } //added From 107a6284b8e1f93d4711fea03d9f134632101426 Mon Sep 17 00:00:00 2001 From: gabrikid Date: Tue, 3 Dec 2013 11:47:51 +0000 Subject: [PATCH 5/5] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) 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.