将java.lang.reflect Field的accessibility设置为true有什么问题吗?

问题描述 投票:0回答:1

我正在尝试编写一个通用函数来打印任何对象的各个字段。我正在使用 java.lang.reflect.Field 来获取对象中的各个字段。然而,只有当我将该字段的 accessible 属性设置为 true 时,该代码才有效,如下面的代码中突出显示的那样。我唯一担心的是,这会导致我在其他地方使用该对象时出现任何问题吗?

Field[] fields = MyClass.class.getDeclaredFields();
for(Field field : fields) {
    try {
        field.setAccessible(true); // Would this lead to any issue anywhere else?
        Object obj = field.get(m); // m is a sample object of MyClass
        System.out.println("Object: " + obj);
    } catch (Exception e) {
        System.out.println("Illegal Access Exception : " + e);
    }
}
java generics reflection
1个回答
0
投票

是的,这意味着您的代码将无法在 JVM21 及更高版本上运行的任何模块化(例如,

module-info.java
,那种特定类型的模块化)系统上运行。

如果模块 A 没有向模块 B 公开某些元素(通常是因为它根本不导出该元素,可能是因为 A 仅将其导出到显式枚举的模块列表),则

.setAccessible
不起作用,并且什么也没有启动时会缺少
--add-opens
开关
java

更一般地说,“打印对象的所有字段”破坏了您不应该破坏的封装规则 - java 不是那种语言。如果您想“打印对象”,则类定义(包含表示该类的

.java
定义的
public class Foo
源文件)需要有一个方法来执行此操作。如果它没有该方法,您将必须编辑该源文件才能添加它,如果您不能这样做,那么您将不得不忍受它。

如果目的是专门调试,您可能最好使用调试器基础设施(JVMTI - 您可以在网络上搜索该基础设施,或者作为代理加载,也可以搜索“java 代理”以查找教程)。为此,您需要完全不同的代码,通常,您不会在代理中使用反射。

© www.soinside.com 2019 - 2024. All rights reserved.