在 Java 中,是不是可以在运行时使用反射将成员变量添加到类中?
Posted
技术标签:
【中文标题】在 Java 中,是不是可以在运行时使用反射将成员变量添加到类中?【英文标题】:In Java is it possible to add a member variable to a class using reflection at run time?在 Java 中,是否可以在运行时使用反射将成员变量添加到类中? 【发布时间】:2018-11-13 00:53:17 【问题描述】:我看到 Java 示例在运行时使用反射从类外部更改成员变量的值。它可以用于私有甚至最终字段。 有没有办法在运行时使用反射向类添加字段?
我发现了非常相似的问题: Can a Java class add a method to itself at runtime?
答案是肯定的,可以使用自定义类加载器或字节码操作工具。
【问题讨论】:
没有文档化的 API。您还应该小心反射和访问私有成员。自 Java 10 和模块的引入以来,反射必须由可见性修饰符(private
、protected
、<default>
)发挥作用。
现在我明白了一点,我想说我们应该区分 Java 语言,在运行时添加字段对 Java 机器实现没有意义。 Java 机器可以为自己的用途添加字段,如垃圾收集、优化和调试。我不知道细节,但自定义类加载器可以做一些这些更改。使用自定义类加载器有一个JRE参数:java -Djava.system.class.loader=myClassLoader
【参考方案1】:
据我所知,答案是否定的。 反射应该反映数据而不是修改它。
【讨论】:
我不同意这种说法的笼统性。如果反射被设计为只读取类信息,为什么 Java 也有方法来编写它?我认为应该有祝福和合法的用途。【参考方案2】:这是不可能的,事实上“在运行时添加字段”的想法甚至没有意义。 Java 是一种静态语言,这意味着要编译您的代码,所有类字段的类型信息必须在编译时知道,这意味着这些字段必须在编译时存在。如果你创建一个像
这样的类class Person
String name;
int age;
然后在代码中的某处引用person.height
,您的代码甚至无法编译,因为height
字段不存在。因此,即使您可以在运行时添加height
字段,您的代码甚至一开始就无法编译有什么意义呢?这就是为什么我说这是不可能的。
【讨论】:
【参考方案3】:使用反射:否 但可以使用设计模式在某种程度上添加行为。
请参阅以下文档。 link
希望对你有所帮助。
【讨论】:
以上是关于在 Java 中,是不是可以在运行时使用反射将成员变量添加到类中?的主要内容,如果未能解决你的问题,请参考以下文章