我试图使用反射修改一个包含对象数组列表的对象。
我知道我无法获得ArrayList中对象的类型,但我(认为)我使用了一个注解来处理这部分,我设置了字段的可访问性。
我使用注解声明类中的内容列表。
@TableAnnotation(type = PhoneNumber.class)
protected List<PhoneNumber> phoneNumbers = new ArrayList<>();
@TableAnnotation(type = Address.class)
private List<Address> addresses= new ArrayList<>();
private List<Role> roles= new ArrayList<>();
......后来在同一个类中,我尝试设置它们:
public void setMemberTable(List<Table> tables, String memberName) throws IllegalAccessException {
Class t = getClass();
for (Field field : getClass().getDeclaredFields()) {
if (field.getName() == memberName) {
field.setAccessible(true);
List array = (List)field.get(this.getClass()); <<<=========== Here is where it is throwing
ArrayList arrayList= (ArrayList)field.get(this.getClass());
//array.add(tables.get(0));
System.out.println();
}
}
}
下面是看起来起作用的注解:
package com.test.database.helpers;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface TableAnnotation {
Class< ?> type();
boolean allowNull() default false;
}
这将抛出:
java.lang.IllegalArgumentException: Can not get java.util.List field com.test.database.entities.Person.phoneNumbers on java.lang.Class
我尝试将成员变量设置为public,但没有效果。我需要帮助才能在setMemberTable()中设置成员变量。
2条答案
按热度按时间n6lpvg4x1#
j.l.reflect.Field
上的.get
方法需要一个示例,你想从这个示例中得到这个字段,你传递的是一个类,它是一个java.lang.Class
类型的对象,当然,它没有这个字段,所以你不能得到它的值,你想用this
来代替。实际上,这一切都没有意义,你就在那里,读你自己的字段,我假设这是测试代码,但如果不是,这一切首先就没有意义。
vs91vp4v2#
您向错误的对象询问字段的值。
当你写作的时候
你试图获取某个示例上的(反射的)字段的值。你传递来检索值的对象是
this.getClass()
,它是java.lang.Class
的一个示例-并且java.lang.Class
没有字段(例如)“phoneNumbers”。若要从示例中检索字段,必须编写
但是,注解掉的行
为什么要尝试将
tables
列表(Table
的示例)中的元素添加到(例如)“phoneNumbers”列表(PhoneNumber
的列表)中?你声称这个注解有效:我没有看到您的代码中使用了该注解,因此很难说它是否有效...