【问题标题】:List<String> Modification using Reflection使用反射的 List<String> 修改
【发布时间】:2021-06-16 01:10:33
【问题描述】:

我有如下代码 sn-p 的列表:

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

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

//xxx,xxx,xxx

【问题讨论】:

  • 我不太明白你的问题。添加到列表后是否要更改该值?
  • 您需要更改特定元素或 nameList 对象吗?
  • @AndréClérigo 在运行时我想屏蔽/修改 List 的值。在运行时。例如,我想通过反射将“罗伯特”更改为“XXX”,所有字段都是如此。
  • @Ismail 我想更改 List 中的所有元素,但条件是仅使用反射。
  • @AndréClérigo List.set()?

标签: java reflection runtime


【解决方案1】:

您可以使用 Java 反射来实现这一点,如下所示:

包含nameList的类:

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 封装。

【讨论】:

  • 您可以通过获取列表的大小并执行 List value = Collections.nCopies(size_of_the_original_list, "xxxxxx"); 来改进您的解决方案;
  • @dreamcrash 完成 :),谢谢您的建议。
  • @Tom 在问题 cmets 中说:我想更改 List 中的所有元素,但条件是仅使用反射。
  • @Tom 感谢您的建议和解释。
  • 可以添加自定义注解概念来解决这个问题。通过创建自定义注释,您可以只修改那些需要的字段。需要修改的字段将使用自定义注释进行注释,其余的将被忽略。供参考:codezup.com/recursively-modify-object-values-reflection-java.
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多