遍历多个子类并尝试获取每个字段的值。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)
但它仍然给出了同样的例外。思想?
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报