首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.NoSuchFieldException:使用反射时

java.lang.NoSuchFieldException:使用反射时
EN

Stack Overflow用户
提问于 2010-01-08 16:40:12
回答 3查看 17.8K关注 0票数 4
代码语言:javascript
复制
public static <A, B> B convert(A instance,
                           Class<B> targetClass) throws Exception {
  B target = (B)targetClass.newInstance();

  for (Field targetField : targetClass.getDeclaredFields()) {
    targetField.setAccessible(true);
    Field field =
        instance.getClass().getDeclaredField(targetField.getName());
    field.setAccessible(true);
    targetField.set(target, field.get(instance));
  }
  return target;
}

上面是我从论坛上得到的代码,当我尝试反射单个类型的对象时,它可以工作,但当我尝试复杂类型时,这意味着在ClassA中我得到了ClassB对象,我得到了java.lang.NoSuchFieldException。有谁可以帮我?

EN

回答 3

Stack Overflow用户

发布于 2010-01-08 16:43:32

您有两个不同的类,很可能具有不同的字段集。因此,如果您的A类与您的B类不具有相同的字段,则会抛出异常。

我建议使用apache commons-beanutilsBeanUtils.copyProperties(source, target)。您只需自己创建第二个对象,并将其传递给该方法。如果字段不同,它不会抛出异常。

您使用这段代码的最终目标是什么?

票数 3
EN

Stack Overflow用户

发布于 2010-01-08 16:48:06

两个建议:

(1)可以在方法的第一行丢弃downcast:

代码语言:javascript
复制
B target = targetClass.newInstance();

(2)添加try catch,以便您可以看到缺少的字段的名称。这将帮助您解决您遇到的问题:

代码语言:javascript
复制
 Field field = null;
 try {
    field = instance.getClass().getDeclaredField(targetField.getName());
 }
 catch(NoSuchFieldException e) {
     throw new RuntimeException("Didn't find field named '" + targetField.getName() + "'");
 }
 ...
票数 1
EN

Stack Overflow用户

发布于 2010-01-08 17:09:15

另一个答案。

如果我正确理解您的注释,您似乎有内部类:类B (Target)是在类A中定义的类。类似于:

代码语言:javascript
复制
 class A {
   int n;

   class B { 
      int n;
   }
}

虽然这两个类似乎有相同的字段,因此-不应该包含字段未找到错误-但它们不是。

内部类(除非它们被定义为静态类)有一个由编译器插入的隐藏字段。此字段属于外部类的类型,并指向创建内部类对象的对象。当使用反射时,这个字段是公开的。因为A没有这样的字段,所以会引发异常。

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

https://stackoverflow.com/questions/2026369

复制
相关文章

相似问题

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