如何通过反射得到字段的包名?

时间:2017-05-19 14:12:00

标签: java 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。为什么呢?

2 个答案:

答案 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(无论您认为是什么)和自定义字段的实用方法。

我认为您还应该找到加载您正在测试的每个特定类的类加载器。