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

Java 反射:在运行时从方法的返回类型获取对象状态,java,spring,annotations,aspectj,Java,Spring,Annotations,Aspectj,使用几个方法注释Java类: @CustomAnnotation public class MyService { public List<MyObject> getMyObjects(){ ... } public SomeObject getSomeObject(){ ... } } } target是包含方法的MyService类 如何获取运行时从MyService类中的方法返回的MyObject和SomeObject的实例字段值?Object target=jp.ge

使用几个方法注释Java类:

@CustomAnnotation
public class MyService {

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

public SomeObject getSomeObject(){
...
}

}
}

target
是包含方法的
MyService

如何获取运行时从
MyService
类中的方法返回的
MyObject
SomeObject
的实例字段值?

Object target=jp.getTarget();
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));
      }
   }
}
for(类超类=target.getClass(); 超类!=Object.class; superclass=superclass.getSuperclass() { Field[]fields=superclass.getDeclaredFields(); AccessibleObject.setAccessible(字段,true); 用于(字段:字段) { 如果(!Modifier.isStatic(field.getModifiers())) { System.out.println(field+“=”+field.get(target)); } } }
对象目标=jp.getTarget();
for(类超类=target.getClass();
超类!=Object.class;
superclass=superclass.getSuperclass()
{
Field[]fields=superclass.getDeclaredFields();
AccessibleObject.setAccessible(字段,true);
用于(字段:字段)
{
如果(!Modifier.isStatic(field.getModifiers()))
{
System.out.println(field+“=”+field.get(target));
}
}
}
@Around(value=“traceReturnedObjectsFields()”)
公共对象traceAnotherOne(ProceedingJoinPoint jp)抛出可丢弃的{
对象res=null;
res=jp.procedure();
如果(res==null)
返回res;
类别c1=res.getClass();
Field[]fields=c1.getDeclaredFields();
AccessibleObject.setAccessible(字段,true);
用于(字段:字段){
如果(!Modifier.isStatic(field.getModifiers())){
System.out.println(field+“=”+field.get(res));
}
}
返回res;
}
@Around(value=“traceReturnedObjectsFields()”)
公共对象traceAnotherOne(ProceedingJoinPoint jp)抛出可丢弃的{
对象res=null;
res=jp.procedure();
如果(res==null)
返回res;
类别c1=res.getClass();
Field[]fields=c1.getDeclaredFields();
AccessibleObject.setAccessible(字段,true);
用于(字段:字段){
如果(!Modifier.isStatic(field.getModifiers())){
System.out.println(field+“=”+field.get(res));
}
}
返回res;
}


你所说的“国家”是什么意思?你是说所有的实例变量等等。。?如果你能更准确地告诉我们你想得到什么,我们可能会提出一些建议:-)编辑。确切地说,state是指实例字段的值。你说的“state”是什么意思?你是说所有的实例变量等等。。?如果你能更准确地告诉我们你想得到什么,我们可能会提出一些建议:-)编辑。确切地说,state意味着实例字段looks的值,如.getSuperClass()与我的情况不匹配。它是由方法返回的类所需要的。我想我误解了这个问题,更新并不能帮助我理解您想要什么。也许给出完整的示例类和所需的输出。简而言之:我需要获取从方法返回的对象的值。我知道对象,它只包含这些方法。请看,代码。最近不得不处理很多反射,特别是检查超类的字段,谢谢你为循环发布这个帖子-我从来没有想过要用这样的@sergionni除非有其他元数据,否则无法“知道”方法将返回哪个字段。是否要根据方法返回类型匹配字段,是否要使用反射调用方法,还是要执行其他操作?看起来.getSuperClass()与我的情况不匹配。它是由方法返回的类所必需的。我想我误解了这个问题,更新并不能帮助我理解你想要什么。也许给出完整的示例类和所需的输出。简而言之:我需要获取从方法返回的对象的值。我知道对象,它只包含这些方法。请看,代码。最近不得不处理很多反射,特别是检查超类的字段,谢谢你为循环发布这个帖子-我从来没有想过要用这样的@sergionni除非有其他元数据,否则无法“知道”方法将返回哪个字段。是否要根据方法返回类型匹配字段,是否要使用反射调用方法,还是要执行其他操作?alehro,在本例中,您的方法返回当前对象(即我的服务类)的字段,我需要获取从服务类的方法返回的对象,而不是服务类字段本身“我需要获取对象,这些对象是从服务类的方法返回的,而不是从服务类字段本身返回的“-这正是它的作用。你试过密码了吗?你读过或明白了吗?我打赌你没有。我应该用自我解释的名字、日志等等来发布整个测试项目吗?对不起,你的语气很无礼,但是被否决了正确的、经过测试的答案真的很奇怪。@sergionni为了确保你走上了正确的道路,请自己回答以下问题:1。如何围绕建议工作?2.如果apect将被改编并应用到您的案例中,那么jp.Procedue()将得到什么回报?嗨,谢谢您的评论。我觉得自己很傻)。经过测试,您的样本绝对有效,并且与我的案例相符。我将尽快恢复投票。谢谢您的帮助。@sergionni没关系。我已经编辑了我的答案。现在您可能可以恢复投票。alehro,在这种情况下,您的方法返回当前对象(即我的服务类)的字段,我需要get对象,这些对象是从服务类的方法返回的,而不是服务类字段本身。“我需要get对象,这些对象是从服务类的方法返回的,而不是服务类字段本身”。-它就是这样做的。你试过密码了吗?你读过或明白了吗?我打赌你没有。我应该用s发布整个测试项目吗
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));
      }
   }
}
@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;
}