IllegalAccessException using reflection on private field
jxhill May 21, 2007 5:20 PMI have an app that relies heavily on reflection. I want to use AOP with it, but I get an error when accessing a private variable through java.lang.reflect.Field. It appears that aspects disables the call to Field.setAccessible(); The following sample code works fine until I apply aspects.
// TestObject.java
package test;
public class TestObject
{
 @SuppressWarnings("unused")
 private String testField = "Initial Value";
}
// TestAspect.java
package test;
import org.jboss.aop.joinpoint.FieldReadInvocation;
import org.jboss.aop.joinpoint.FieldWriteInvocation;
public class TestAspect
{
 public Object accessField(FieldReadInvocation invocation) throws Throwable
 {
 return invocation.invokeNext();
 }
 public Object accessField(FieldWriteInvocation invocation) throws Throwable
 {
 return invocation.invokeNext();
 }
}
// Main.java
package test;
import java.lang.reflect.Field;
public class Main
{
 public static void main(String[] args)
 {
 TestObject test = new TestObject();
 fieldReadTest(test);
 out("");
 fieldWriteTest(test, "Some new value");
 out("");
 fieldReadTest(test);
 }
 public static void fieldWriteTest(TestObject test, Object newValue)
 {
 infoOut("Begin Field Write Test");
 try
 {
 Field f = TestObject.class.getDeclaredField("testField");
 f.setAccessible(true);
 f.set(test, newValue);
 infoOut("End Field Write Test - Success")
; }
 catch(Exception e)
 {
 out(e);
 infoOut("End Field Write Test - FAILED");
 }
 }
 public static void fieldReadTest(TestObject test)
 {
 infoOut("Begin Field Read Test");
 try
 {
 Field f = TestObject.class.getDeclaredField("testField");
 f.setAccessible(true);
 System.out.println(String.valueOf(f.get(test)));
 infoOut("End Field Read Test - Success")
; }
 catch(Exception e)
 {
 out(e);
 infoOut("End Field Read Test - FAILED");
 }
 }
 private static void infoOut(String s)
 {
 System.out.println("[" + s + "]");
 }
 private static void out(Object o)
 {
 System.out.println(o.toString());
 }
}
jboss-aop.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <aop> <aspect name="ReflectionAspect" class="org.jboss.aop.reflection.ReflectionAspect" scope="PER_VM"/> <bind pointcut="call(* java.lang.reflect.Field->get*(..))"> <advice name="interceptFieldGet" aspect="ReflectionAspect"/> </bind> <bind pointcut="call(* java.lang.reflect.Field->set*(..))"> <advice name="interceptFieldSet" aspect="ReflectionAspect"/> </bind> <aspect class="test.TestAspect" scope="PER_VM"/> <bind pointcut="field(* test.TestObject->*)"> <advice name="accessField" aspect="test.TestAspect"/> </bind> </aop>
Am I doing something wrong, or is this a bug?
 
     
    