当前位置: 首页 > 面试题库 >

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

夏侯智鑫
2023-03-14
问题内容

例如,假设我想“提取” 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真正需要的是使用不同的方法。很好,但这有可能吗?

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


问题答案:

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

简单回答是不。

Java是一种静态语言,不支持将新的变量声明注入到现有的已编译程序中。有其他选择(以降低有用性/增加难度的顺序):

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

第一种方法是最好的。Java是一种静态语言,如果您不反对它,则效果最佳。如果这对您来说是个问题,则可能您使用的语言错误。

后两个是困难/复杂的,并且具有很大的性能成本。他们几乎肯定不会帮助…



 类似资料:
  • 问题内容: 我正在一个项目中,该项目有很多由库创建的对象,并且无法访问这些对象的创建过程。 以下代码片段很好地说明了我的问题。 码: 是Clazz在编译时可能会或可能不会实现的接口。 码: 以下代码是我遇到的问题。请注意以下几点: 仅在c是的实例时调用。 并且都是我无法访问的类中的私有方法。 在编译时,将 不 包含名为的方法。 ExampleExecutor 不是 我的课程。我无法以任何方式访问它

  • 问题内容: 假设我在使用Java 8类型注释的类中具有以下成员: 是否可以在运行时使用反射读取在String类型上使用的给定注释?如果是这样,将如何进行? 更新:这是注释类型的定义: 问题答案: 是的,有可能。表示这种结构的反射类型称为。这是如何获取注释的示例:

  • 问题内容: 在数学课上,我们学习了如何定义新的运算符。例如: 这定义了法律。对于x和y的任何实数,x y是x + 2y。 范例:。 可以在JavaScript中定义这样的运算符吗?我知道函数可以胜任: 但我想使用以下语法: 代替这个: 哪个是最接近这个问题的解决方案? 问题答案: 最简洁的答案是不。ECMAScript(标准JS所基于的)不支持运算符重载。 可以使用sweet.js之类的第三方工具

  • 问题内容: 我只想知道是否可以在Java中创建命令提示符。我的朋友要求这样做,我想知道是否可行。如果有可能,有人可以建议我一些api或其他东西吗?谢谢。 编辑:我想使其类似于Windows命令提示符 编辑2:我想制作一个SWING GUI应用程序并将命令提示符放在其中。 问题答案: 您可以使用Process API在Java中运行命令。您还可以 获取 输出并将输入 写入运行 的进程。有关更多信息,

  • 问题内容: 使用JDK 1.6进行编译时,是否可以选择构建可在JRE 1.5上运行的Java代码? PS:我是Java新手。 问题答案: 如果使用1.6编译代码,则它将无法在1.5上运行。如果您希望它在1.5中运行,则可以使用1.5编译代码,并且它可以在两者上运行。 尝试使用1.5进行编译,如果有错误,则将其发布。无法在1.5上编译的唯一方法是,如果在代码中使用特定的1.6增强功能。 回答真正的问

  • 问题内容: 昨晚我在玩Java8 Lambda,我想知道是否有可能在运行时检索Lambda表达式。简而言之,据我所知,Lambda表达式在运行时被转换为(静态)方法,然后使用InvokeDynamics进行调用。 让我们举一个这样的例子: 其中将是以a 作为参数的自定义方法。在此方法内部,在这种情况下,如何以类似于Lambda表达式()的形式检索参数? 我尝试使用ASM5_BETA读取参数类的生成