在 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 和模块的引入以来,反射必须由可见性修饰符(privateprotected<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 中,是不是可以在运行时使用反射将成员变量添加到类中?的主要内容,如果未能解决你的问题,请参考以下文章

Java反射机制

深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

java 反射

java反射

Java 反射是什么?

Java反射机制深入详解