Java Reflection从一个字段中获取实例

sam*_*sam 8 java reflection field instance

有没有办法从一个领域获得实例?
这是一个示例代码:

public class Apple {
    // ... a bunch of stuffs..
}

public class Person {
    @MyAnnotation(value=123)
    private Apple apple;
}

public class AppleList {
    public add(Apple apple) {
        //...
    }
}

public class Main {
    public static void main(String args[]) {
        Person person = new Person();
        Field field = person.getClass().getDeclaredField("apple");

        // Do some random stuffs with the annotation ...

        AppleList appleList = new AppleList();

        // Now I want to add the "apple" instance into appleList, which I think
        // that is inside of field.

        appleList.add( .. . // how do I add it here? is it possible?

        // I can't do .. .add( field );
        // nor .add( (Apple) field );
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要使用Reflection,因为我正在使用它带注释.这只是一个"示例",该方法AppleList.add(Apple apple)实际上是通过从类中获取方法然后调用它来调用的.

这样做,如: method.invoke( appleList, field );

原因: java.lang.IllegalArgumentException: argument type mismatch

*编辑* 这可能对正在寻找同样事物的人有所帮助.

如果是Person类,则有2个或更多Apple变量:

public class Person {
    private Apple appleOne;
    private Apple appleTwo;
    private Apple appleThree;
}
Run Code Online (Sandbox Code Playgroud)

当我得到Field时,如:

Person person = new Person();
// populate person
Field field = person.getClass().getDeclaredField("appleTwo");
// and now I'm getting the instance...
Apple apple = (Apple) field.get( person );
// this will actually get me the instance "appleTwo"
// because of the field itself...
Run Code Online (Sandbox Code Playgroud)

一开始,单独看一下这条线:(Apple) field.get( person );
让我觉得它会去找一个与Apple课程相匹配的实例.
这就是为什么我想知道:"苹果会回归哪个?"

Jon*_*eet 12

这个领域不是苹果本身 - 它只是一个领域.因为它是一个实例字段,所以在获得值之前需要一个声明类的实例.你要:

Apple apple = (Apple) field.get(person);
Run Code Online (Sandbox Code Playgroud)

... 当然,apple填充的实例填充了字段person.

  • 不确定你要做什么,但是如果你只是想要获得Apple类型的所有字段,你可能必须使用Class.getDeclaredFields()来获取所有字段然后循环遍历那些以查看哪些是键入Apple. (2认同)