首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用反射,获取对象的父类/字段。

使用反射,获取对象的父类/字段。
EN

Stack Overflow用户
提问于 2013-10-12 04:17:32
回答 3查看 2.5K关注 0票数 1

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

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

代码语言:javascript
运行
复制
public class Foo{

}

public class Bar{

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

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

}

我希望使用Field实例获取mFoomFoo对象,否则使用null,然后使用TestAnnotation test = field.TestAnnotation(SQLiteID.class);获得注释。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-12 04:29:24

一般来说,这是不可能的/不可行的。

同一个对象实例可以有多个名称--也就是说,同一个对象可以同时分配给许多不同的静态字段、实例字段、参数、局部变量(等等)。

所有的“解决方案”都涉及对所有这些变量的某种形式的迭代,这是很少可行的,应该避免这样的一般设计。即使减少了域(例如注释),也仍然存在一个类似的问题--即如何查找所述域的所有此类根(具有特定注释的成员的对象实例)?

票数 4
EN

Stack Overflow用户

发布于 2013-10-12 04:21:50

我希望使用Foo实例获取mFoo的字段对象。

这是倒行逆施,不可能。

您可以通过测试Field of Bar的类型来获得它,然后尝试检索特定的注释。

代码语言:javascript
运行
复制
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实例的字段值进行比较。

票数 2
EN

Stack Overflow用户

发布于 2013-10-12 06:29:30

这在Java中是不可能的。这是可能的编写JVM代理,但可能会有一个严重的性能损失,因为所有的簿记。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19330491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档