【发布时间】:2023-04-07 21:31:01
【问题描述】:
例如,假设我想将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";
我怎么能这样做,忽略“你为什么要这样做?”你可能会被敦促问我的问题。
以前曾多次提出类似的问题,但从未给出真正的答案,因为 OP 真正需要的是使用不同的方法。这很好,但这可能吗?
我查看了反射,似乎没有任何方法可以让我向实例添加额外的字段,更不用说动态创建局部变量了。
【问题讨论】:
-
我能想到的唯一可能的方法是使用运行时字节码注入。据我所知,我们无法在编译前创建动态变量。
-
让我猜猜,您主要是 PHP 程序员,不是吗?我接近了吗?
-
我认为
java.lang.reflect.Proxy是您可以去的最接近的地方。即使那样你也只能实现在编译时定义的东西。 -
是的,但您将无法在通过该机制创建的代码之外使用它们(除非界面一致)。
-
@HovercraftFullOfEels 我从来没有在 PHP/Python/JS 的实际代码中使用过它(在堆栈上创建新的局部变量),但事实是,如果我需要它,它就在那里。另一个特性是动态地向实例添加成员,但更有用。