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。有谁可以帮我?
发布于 2010-01-08 16:43:32
您有两个不同的类,很可能具有不同的字段集。因此,如果您的A类与您的B类不具有相同的字段,则会抛出异常。
我建议使用apache commons-beanutils的BeanUtils.copyProperties(source, target)。您只需自己创建第二个对象,并将其传递给该方法。如果字段不同,它不会抛出异常。
您使用这段代码的最终目标是什么?
发布于 2010-01-08 16:48:06
两个建议:
(1)可以在方法的第一行丢弃downcast:
B target = targetClass.newInstance();(2)添加try catch,以便您可以看到缺少的字段的名称。这将帮助您解决您遇到的问题:
Field field = null;
try {
field = instance.getClass().getDeclaredField(targetField.getName());
}
catch(NoSuchFieldException e) {
throw new RuntimeException("Didn't find field named '" + targetField.getName() + "'");
}
...发布于 2010-01-08 17:09:15
另一个答案。
如果我正确理解您的注释,您似乎有内部类:类B (Target)是在类A中定义的类。类似于:
class A {
int n;
class B {
int n;
}
}虽然这两个类似乎有相同的字段,因此-不应该包含字段未找到错误-但它们不是。
内部类(除非它们被定义为静态类)有一个由编译器插入的隐藏字段。此字段属于外部类的类型,并指向创建内部类对象的对象。当使用反射时,这个字段是公开的。因为A没有这样的字段,所以会引发异常。
https://stackoverflow.com/questions/2026369
复制相似问题