[英]How to get the packagename of fields by reflection?
我想检测类中的字段,这些字段要么是自定义字段(例如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
。 为什么?
您必须调用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
java.lang
是一个在任何Java类上隐式导入的包。 这就是为什么您可以引用其中包含的许多类(如Object或String),而无需在源中包含任何导入的原因。
但是,没有什么可以阻止您或任何人创建名为java.lang
的程序包并在其中包含您自己的类。 因此,这不是区分本地Java(无论您认为是什么)与自定义字段的实际方法。
我认为您还应该找出加载了您正在测试的每个特定类的类加载器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.