动态实例化类?

时间:2011-09-29 12:22:39

标签: java reflection instantiation

假设我有这个数组:

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

是否可以使用这些名称动态实例化Stack,因此会有3个名为stack1stack2stack的对象?在代码后面,我想打电话给stack1.pop()stack3.empty(),例如。

我被告知要看一下反思,但仍不确定如何。

3 个答案:

答案 0 :(得分:3)

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

无法“动态”创建“变量”。例如:

String s = "foo";

// some magic that creates a variable identified by s

foo.callSomeMethod();

不会工作。

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

可以做什么(以及有时正确的方法)是创建Map<String,YourType>并通过此地图保存每个新创建的对象给定String

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

// ...

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

答案 1 :(得分:1)

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

如果它只是一个变量名,那么你仍然会错过这个类型。

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

此外,如果您可以详细说明您正在尝试的内容,这将会有所帮助。

答案 2 :(得分:0)

为什么不使用地图?

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