java 尝试使用反射设置成员ArrayList

vc6uscn9  于 2023-02-18  发布在  Java
关注(0)|答案(2)|浏览(150)

我试图使用反射修改一个包含对象数组列表的对象。
我知道我无法获得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()中设置成员变量。

n6lpvg4x

n6lpvg4x1#

(List)field.get(this.getClass());

j.l.reflect.Field上的.get方法需要一个示例,你想从这个示例中得到这个字段,你传递的是一个类,它是一个java.lang.Class类型的对象,当然,它没有这个字段,所以你不能得到它的值,你想用this来代替。
实际上,这一切都没有意义,你就在那里,读你自己的字段,我假设这是测试代码,但如果不是,这一切首先就没有意义。

vs91vp4v

vs91vp4v2#

您向错误的对象询问字段的值。
当你写作的时候

field.get(this.getClass())

你试图获取某个示例上的(反射的)字段的值。你传递来检索值的对象是this.getClass(),它是java.lang.Class的一个示例-并且java.lang.Class没有字段(例如)“phoneNumbers”。
若要从示例中检索字段,必须编写

field.get(this)

但是,注解掉的行

array.add(tables.get(0));

为什么要尝试将tables列表(Table的示例)中的元素添加到(例如)“phoneNumbers”列表(PhoneNumber的列表)中?
你声称这个注解有效:我没有看到您的代码中使用了该注解,因此很难说它是否有效...

相关问题