List<String> 使用反射修改

List<String> Modification using Reflection

我有如下代码片段的列表:

List<String> nameList = new ArrayList<>();
nameList.add("Robert");
nameList.add("Tom");
nameList.add("Curran");
//robert, tom, curran

现在我想在 Java 中使用反射 API 修改这些列表值。如果我们打印列表,输出如下所示:

//xxx,xxx,xxx

您可以使用 Java 反射实现此目的,如下所示:

包含nameList的class:

public class SampleClass {
    List<String> nameList;
}

这是一个简单的测试方法,使用SampleClass:

@Test
public void testReflection() throws NoSuchFieldException, IllegalAccessException {
    SampleClass sample= new SampleClass();
    sample.nameList = new ArrayList<>();
    sample.nameList.add("Robert");
    sample.nameList.add("Tom");
    sample.nameList.add("Curran");

    Field fieldList = SampleClass.class.getDeclaredField("nameList");
    fieldList.setAccessible(true);
    List<String> listToModify = (List<String>) fieldList.get(sample);

    for (int i =0;i<listToModify.size();i++) {
        if(listToModify.get(i).equals("Robert"))
            listToModify.set(i, "xxxxxx");
    };

    System.out.println(sample.nameList.get(0));
    System.out.println(sample.nameList.get(1));
    System.out.println(sample.nameList.get(2));
}

输出:

xxxxxx
Tom
Curran

注意:我不推荐使用setAccessible(true),它破坏了OOP封装。

您可以添加自定义注解概念来解决这个问题。通过创建自定义注释,您可以简单地修改那些需要的字段。需要修改的字段将使用自定义注释进行注释,其余的将被忽略。供参考:Java reflection.