在Java中,是否可以在运行时使用反射将成员变量添加到类中?

在Java中,是否可以在运行时使用反射将成员变量添加到类中?,java,reflection,runtime,member,Java,Reflection,Runtime,Member,我看到了一些Java示例,它们使用反射在运行时从类外部更改成员变量的值。它可以用于私有字段,甚至是最终字段。 是否有一种方法可以在运行时使用反射将字段添加到类中 我发现了非常相似的问题: 答案是肯定的,可以使用自定义类装入器或字节码操作工具 据我所知,答案是否定的。 反射应该反映数据,而不是修改数据。这是不可能的,事实上,“在运行时添加字段”的想法甚至没有意义。Java是一种静态语言,这意味着要编译代码,必须在编译时知道所有类字段的类型信息,这意味着这些字段必须在编译时存在。如果您创建一个类,

我看到了一些Java示例,它们使用反射在运行时从类外部更改成员变量的值。它可以用于私有字段,甚至是最终字段。 是否有一种方法可以在运行时使用反射将字段添加到类中

我发现了非常相似的问题:


答案是肯定的,可以使用自定义类装入器或字节码操作工具

据我所知,答案是否定的。
反射应该反映数据,而不是修改数据。

这是不可能的,事实上,“在运行时添加字段”的想法甚至没有意义。Java是一种静态语言,这意味着要编译代码,必须在编译时知道所有类字段的类型信息,这意味着这些字段必须在编译时存在。如果您创建一个类,如

class Person {
    String name;
    int age;
}
然后在代码的某个地方引用
person.height
,代码甚至不会编译,因为
height
字段不存在。因此,即使您可以在运行时添加
height
字段,您的代码一开始就无法编译,这又有什么意义呢?这就是为什么我说这是不可能的。

使用反射:不 但是可以使用设计模式在一定程度上添加行为

请参阅以下文档。


我希望这将对您有所帮助。

没有文档化的API。您还应该注意反射和访问私人成员。自从Java10和模块的引入以来,反射必须通过可见性修饰符(
private
protected
)来发挥作用。正如我现在更了解的那样,我想说,我们应该区分Java语言,在运行时添加字段与Java机器实现没有任何意义。Java机器可能会为自己的用途添加字段,如垃圾收集、优化和调试。我不知道细节,但自定义类加载器可以做一些更改。有一个JRE参数可以使用自定义类加载器:java-Djava.system.class.loader=MyClassLoader我不同意此语句的一般性。如果反射被设计成只读取类信息,为什么Java也会有方法来编写它呢?我认为这应该是有福的和合法的用途。