返回

遍历多个子类并尝试获取每个字段的值。JAVAlang.IllegalArgumentException:无法将XXX字段XX设置为XXX

发布时间:2022-04-02 18:50:29 213
# java# java

我试图遍历一个类的每个子类,并为每个子类获取每个字段的值。我已经成功地用一个ClassPathScanningCandidateComponentProvider对象,还可以查看每个字段。

这正如预期的那样:

try {
        ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(
                false);
        provider.addIncludeFilter(new AssignableTypeFilter(Resource.class));

        Set components = 
      provider.findCandidateComponents("com/availaboard/engine/resource");
        for (BeanDefinition component : components) {
            Class cls = Class.forName(component.getBeanClassName());
            System.out.println("Class: " + cls);
            for (Field field : cls.getDeclaredFields()) {
                field.setAccessible(true);
                System.out.println("Field: " + field);
                System.out.println("Field Type: " + field.getType());
            }
        }

输出:

Class: class com.availaboard.engine.resource.Equipment
Class: class com.availaboard.engine.resource.Resource
Field: private java.lang.String com.availaboard.engine.resource.Resource.name
Field Type: class java.lang.String
Field: private com.availaboard.engine.resource.Status com.availaboard.engine.resource.Resource.status
Field Type: class com.availaboard.engine.resource.Status
Field: private int com.availaboard.engine.resource.Resource.id
Field Type: int
Class: class com.availaboard.engine.resource.Room
Class: class com.availaboard.engine.resource.User
Field: private java.lang.String com.availaboard.engine.resource.User.firstName
Field Type: class java.lang.String
Field: private java.lang.String com.availaboard.engine.resource.User.lastName
Field Type: class java.lang.String
Field: private java.lang.String com.availaboard.engine.resource.User.email
Field Type: class java.lang.String
Field: private java.lang.String com.availaboard.engine.resource.User.username
Field Type: class java.lang.String
Field: private java.lang.String com.availaboard.engine.resource.User.password
Field Type: class java.lang.String

问题是当我试图得到一个字段的值时。因为没有设置任何字段应该返回null。field.get(field.getType())但是现在程序却抛出了一个错误。

Class: class com.availaboard.engine.resource.Equipment
Class: class com.availaboard.engine.resource.Resource
Field: private java.lang.String com.availaboard.engine.resource.Resource.name
Field Type: class java.lang.String
java.lang.IllegalArgumentException: Can not set java.lang.String field com.availaboard.engine.resource.Resource.name to java.lang.Class
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)

该错误发生在它到达的第一个字段之后Resource对象,因为这是第一个具有字段的对象。

我也试着把这门课交给老师field.get()方法:field.get(cls)但它仍然给出了同样的例外。思想?

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(2)
按点赞数排序
用户头像