【问题标题】:Instantiating classes dynamically? [duplicate]动态实例化类? [复制]
【发布时间】:2011-11-27 16:12:37
【问题描述】:

假设我有这个数组:

String[] names = {"stack1", "stack2", "stack3"};

是否可以使用这些名称动态实例化Stack,因此将有3个对象分别命名为stack1、stack2和stack"?稍后在代码中,我想调用@987654327 @,或stack3.empty(),例如。

有人告诉我看一下反射,但仍然不确定如何。

【问题讨论】:

  • 问了 24 个问题,接受了 0 个答案...我想我会通过的,谢谢。
  • @SJuan76 是的,看他的个人资料,他真的不介意:)
  • 正如其他人指出的那样,您应该接受能够回答您问题的回复。

标签: java reflection instantiation


【解决方案1】:

例如,如果您在 String 中具有类名,您可以通过反射创建对象。

您不能“动态地”创建“变量”。例如:

String s = "foo";

// some magic that creates a variable identified by s

foo.callSomeMethod();

那行不通。

Java 中的变量(字段、局部变量和参数)只能在编译时创建。

您可以做的(这有时是正确的方法)是创建一个Map<String,YourType>,并通过此映射以给定的@保存每个新创建的对象987654324@:

Map<String,MyType> map = new HashMap<String,MyType>;
String s = "foo";
map.put(s, new MyType());

// ...

map.get("foo").callSomeMethod();

【讨论】:

    【解决方案2】:

    除非stack1 是默认包中的类,否则您将无法创建该“类型”的类。

    如果它只是一个变量名,那么无论如何你都缺少类型。

    查看 Java Compiler API,它应该允许您动态创建源代码,然后编译和使用它们。我自己还没有使用过,但也许这篇文章会有所帮助:http://www.javabeat.net/articles/73-the-java-60-compiler-api-1.html

    此外,如果您能详细说明您正在尝试什么,这将很有帮助。

    【讨论】:

      【解决方案3】:

      为什么不直接使用地图?

      Map<String, Stack<String>> m = new HashMap<String, Stack<String>>();
      m.put("stack1", new Stack<String>());
      m.get("stack1").push("Hello!");
      

      【讨论】:

      • 嗯,我只是好奇这在 Java 中是否可行。无论如何感谢您的提示,对我来说看起来更容易。
      猜你喜欢
      • 1970-01-01
      • 2014-01-26
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多