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.
我有如下代码片段的列表:
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.