【问题标题】:How to get value of an field using reflection? [duplicate]如何使用反射获取字段的值? [复制]
【发布时间】:2018-05-17 03:55:47
【问题描述】:

我正在编写一个休眠侦听器,它将在传递给数据库之前和之后执行一些操作。我必须使用反射来获取字段的值。我写了一个示例代码来演示我的问题。

public class Test {

FileAttachment  attachment = new FileAttachment();

public Test() {
    attachment.setData(new byte[1]);
}


void test() throws Exception{
    for(Field field :attachment.getClass().getDeclaredFields()) {
        if ((CloudPersistable.class).isAssignableFrom(field.getType())) {


            System.out.println("BOom");

            Class<?> x = Class.forName(attachment.getClass().getCanonicalName());
            Field f = x.getDeclaredField("data");
            f.setAccessible(true);

            CloudPersistable attachment = (CloudPersistable) f.get(f.getClass());
            System.out.println(attachment);

        }
    }


}

public static void main(String[] args)throws Exception {
     new Test().test();;


}

}

** 请帮助解决行 CloudPersistable attachment = (CloudPersistable) f.get(f.getClass());

提前谢谢..!!!

【问题讨论】:

  • 你必须传递给 f.get 你想要检索字段值的对象,而不是它的类
  • 特别看看stackoverflow.com/a/38736542/1531124。除此之外:真的真的不要试图通过快速阅读其 API 来学习反射。阅读一本很好的教程/书籍。这是很复杂的事情,每一个的细节都很重要。有无数种方法可以让反射出错,直到运行时你才注意到。因此:不要实验。研究如何正确地做,并按照工作示例,一步一步,一个字符一个字符!

标签: java reflection


【解决方案1】:

您需要读取字段值的对象。因此,如果您要读取这样的值:

this.attachment.data

使用反射,你会这样做:

field.get(this.attachment);

附注:您只需键入Attachment.class 即可获取已知类的类对象,这样您的循环将被声明为:

for(Field field : Attachment.class.getDeclaredFields())

这清楚地表明它是正在读取的完全相同的类(可能不是不同的运行时类)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多