繁体   English   中英

如何通过反射获取字段的包名?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM