是否可以在Java中在运行时创建变量?

Nul*_*ion 7 java variables dynamic

例如,假设我想"提取" String[] fruits = {"Pear", "Banana", "Apple"};成三个独立的变量,例如:

for (int i=0; i != fruits.length; ++i) {
    // of course there's no eval in Java
    eval("String fruit + i = " + fruits[i] + ";"); 
}

// ie: code that creates something equivalent to the following declarations:
String fruit0 = "Pear";
String fruit1 = "Banana";
String fruit2 = "Apple";
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做,忽略了"你为什么要这么做?" 问你可能会被要求我.

之前已经多次提出过类似的问题,但是从未给出真正的答案,因为OP真正需要的是使用不同的方法.那没关系,但这有可能吗?

我看过反射,似乎没有任何方法可以让我甚至为实例添加额外的字段,更不用说动态创建本地.

Ste*_*n C 15

是否可以在Java中在运行时创建变量?

简单回答是不.

Java是一种静态语言,不支持将新变量声明注入现有的编译程序.有替代方案(按有用性降低/难度增加的顺序):

  • 将您的"变量"表示为a中的名称/值对Map.或者提出一些不需要真正动态变量的其他设计.
  • 使用在JVM上运行的脚本语言,可以从Java调用.
  • 使用某种模板机制生成包含声明的新源代码,并动态编译和加载它.
  • 使用字节代码操作库(例如BCEL)动态创建类文件,然后动态加载它们.

第一种方法是最好的.Java是一种静态语言,如果你不打它,效果最好.如果这对您来说是个问题,也许您使用的是错误的语言.

最后两个是困难/复杂的并且具有显着的性能成本.他们几乎肯定不会帮忙......


Ale*_*man 5

问题不在于为什么要这么做,而是“您打算怎么做?”。因此,假设在运行时变量名fruits2神奇地出现在您的方法堆栈中。怎么办?您必须在编译时知道它的名称才能利用它。反射不会帮助您访问局部变量。

无论如何,如果您描述了更详细的用例,我将很感兴趣。