我希望检测班级中的字段,这些字段是自定义字段(如Address
或是本机java字段。
因此,我尝试阅读每个字段的包名称(以便稍后检查它们是否以java.*
开头。
public class ReflectionTest {
public class MyDTO {
private String name;
private Address address;
}
public class Address {
private String street;
private String zip;
private String town;
}
@Test
public void testPackageName() {
for (Field field : MyDTO.class.getDeclaredFields()) {
//always: java.lang.Class
System.out.println(field.getGenericType().getClass().getPackage().getName());
}
}
}
问题:显示的包始终是java.lang
。为什么呢?
答案 0 :(得分:2)
您必须致电getType()
而不是getGenericType()
。考虑这个例子:
public class Sandbox {
public int intField;
public Sandbox myField;
public static void main(String[] args) {
Arrays.stream(Sandbox.class.getDeclaredFields()).forEach(f ->
System.out.println(f.getName() + " : " + f.getType().getName()));
}
}
<强>输出强>
intField : int
myField : my.answer.Sandbox
答案 1 :(得分:1)
java.lang
是一个隐式导入任何Java类的包。这就是为什么你可以引用其中包含的许多类(如Object或String),而不在源代码中包含任何导入。
但是,没有什么可以阻止您或任何人创建名为java.lang
的包并在其中包含您自己的类。因此,这不是区分原生Java(无论您认为是什么)和自定义字段的实用方法。
我认为您还应该找到加载您正在测试的每个特定类的类加载器。