Java:动态属性

女士们,先生们,

我是Java的新手,如果它很明显,请原谅我,但我没有找到太多关于它的信息。

我想在运行时为类创建动态属性(变量)(定义一个可以在运行时通过添加或更改属性和方法来更改的对象)。


原因:我想在 GAE 中存储一个数据模型,该模型可以在编译应用后动态扩展(是的,DataStore 允许这样做)。应该添加哪些属性也存储在数据存储中(这就像使用机器人来构建机器人一样......滑稽)。

Python允许我在运行时添加属性。Groovy似乎也允许这样做。在“纯”Java世界中,唯一表明这个方向的似乎是“动态代理”。

但我还不知道他们是否做到了这一点。


答案 1

Java 没有动态添加属性的功能。它也没有能力在运行时动态创建类或在运行时更改它们。Java是强静态类型化的。您可以做的最好的事情就是将这些属性放入或类似属性中。Map

编辑:好的,显然需要一些澄清。OP特别提到了GAE,这些方法都不起作用,但我会提到它们,因为有些人似乎对它们的缺席持例外态度。

Java Compiler API(Java 6+)允许您在运行时编译Java类。从技术上讲,您可以写出一个Java源文件以完全按照您想要的方式查找,编译并加载它。

Java 字节码库可以在运行时重写类。这被JPA(和其他)等库使用。您可以通过这种方式修改类。

然而,OP所指的是a)参考GAE的工作,b)更多的是Javascript如何允许您通过动态添加,删除或更改属性在运行时修改类或特定实例的顺序。Java当然不会这样做,特别是在GAE上不会这样做。

以上也不例外,就像在C++中强制一个类,以便您可以读取私有成员并不意味着C++没有私有成员。您基本上通过这两种方法绕过了Java运行时,即使它们是Java的一部分。char *


答案 2

Java不支持它。最好的办法是将/管理到一些外部数据存储中,您可以从 Java 代码内部访问这些数据存储。作为一个基本的内置示例,您可以使用 java.util.Properties API,您可以在每个请求上加载该 API,或者按定时间隔缓存并重新加载,或者以编程方式重新加载。然后,您可以将键值对存储在一个文件中,该文件仅放在类路径中。这是关于该主题的Sun教程.properties

属性文件可以如下所示

key1=value1
key2=value2
key3=value3

如果将其放在类路径中,则可以将其加载为

Properties properties = new Properties();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
properties.load(classLoader.getResourceAsStream("file.properties"));
String key1 = properties.getProperty("key1"); // value1

其他替代方法是例如XML文件(您可以使用任何Java XML API访问)或仅数据库(您可以使用JDBC API访问)。