反射:在运行时从返回类型的方法获取对象状态

时间:2011-10-15 14:00:08

标签: java spring annotations aspectj

使用多种方法注释Java类:

@CustomAnnotation
public class MyService {

public List<MyObject> getMyObjects(){
...
}

public SomeObject getSomeObject(){
...
}

}

我应该记录MyObjectSomeObject个实例的字段值。

aspectj部分,其中MyService对象得到了:

public void logg2(JoinPoint jp) {
    Object target = jp.getTarget();

}

targetMyService类,它包含方法。

如何获取MyObjectSomeObject的实例字段的值,这些值是从运行时MyService类中的方法返回的?

2 个答案:

答案 0 :(得分:1)

@Around(value = "traceReturnedObjectsFields()")
public Object traceAnotherOne(ProceedingJoinPoint jp) throws Throwable {
    Object res = null;
    res = jp.proceed();
    if (res == null)
        return res;
    Class<?> c1 = res.getClass();
    Field[] fields = c1.getDeclaredFields();
    AccessibleObject.setAccessible(fields, true);
    for (Field field : fields) {
        if (!Modifier.isStatic(field.getModifiers())) {
            System.out.println(field + " = " + field.get(res));
        }
    }
    return res;
}

答案 1 :(得分:0)

Object target = jp.getTarget();
for (Class<?> superclass = target.getClass();
     superclass != Object.class;
     superclass = superclass.getSuperclass())
{
   Field[] fields = superclass.getDeclaredFields();
   AccessibleObject.setAccessible(fields, true);
   for (Field field : fields)
   {
      if (!Modifier.isStatic(field.getModifiers()))
      {
         System.out.println(field + " = " + field.get(target));
      }
   }
}