1

在 Java 中是否可以使用对象的实例及其类类型来获取对象的“父”类?

假设我们有这两种类类型和注释类型:

public class Foo{

}

public class Bar{

    @TestAnnotation
    public Foo mFoo = new Foo();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{

}

我想获得使用的实例的Field对象,否则,我将使用这个获得注释mFooFoonullTestAnnotation test = field.TestAnnotation(SQLiteID.class);


我想要的最终结果是知道实例是否Foo是包含某个注释的另一种类型的一部分

这似乎有点牵强,所以我不认为这是可能的。

4

3 回答 3

4

This is not possible/feasible in general.

The same object instance can have many names - that is, the same object can be assigned to many different static fields, instance fields, parameters, local variables (etc) simultaneously.

All "solutions" involve some form of iteration over all such variables, which is rarely feasible and such general designs should be avoided. Even with a reduced domain (such as with annotations) a similar issue remains - i.e. how to find all such roots (objects instances with members having a certain annotation) of said domain?

于 2013-10-12T04:29:24.460 回答
2

我想使用 Foo 的实例获取 mFoo 的 Field 对象。

这是倒退的事情,不可能。

您可以通过测试其类型来获取Fieldof Bar,然后尝试检索特定的注释

Field[] fields = Bar.class.getDeclaredFields();
for (Field field : fields) {
    if (Foo.class.isAssignableFrom(field.getType())) {
        TestAnnotation testAnnotation = field.getAnnotation(TestAnnotation.class);
        System.out.println(testAnnotation); // might be null, if annotation doesn't exist
    }
}

现在,如果你有一个实例,Foo你也可以将它与一个实例的字段值进行比较Bar

于 2013-10-12T04:21:50.920 回答
1

这在Java中是不可能的。这可以通过编写 JVM 代理来实现,但由于所有的簿记,可能会导致严重的性能损失。

于 2013-10-12T06:29:30.003 回答