从Java中的变量创建新的类

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

有没有办法从Java中的String变量创建一个新的类?

String className = "Class1";
//pseudocode follows
Object xyz = new className(param1, param2);

另外,如果可能,结果对象必须是Object类型?

可能有更好的方法,但我希望能够从XML文件中检索值,然后创建以这些字符串命名的类。每个类都实现相同的接口并从相同的父类派生,因此我可以在该类中调用特定的方法。

提问于
用户回答回答于

这是你想要做的:

String className = "Class1";
Object xyz = Class.forName(className).newInstance();

请注意,newInstance方法不允许使用参数化构造函数。(请参阅Class.newInstance文档

如果您确实需要使用参数化构造函数,则需要执行以下操作:

import java.lang.reflect.*;

Param1Type param1;
Param2Type param2;
String className = "Class1";
Class cl = Class.forName(className);
Constructor con = cl.getConstructor(Param1Type.class, Param2Type.class);
Object xyz = con.newInstance(param1, param2);

请参阅Constructor.newInstance文档

用户回答回答于

是的,您可以使用反射,使用Class.forName(name),给定字符串名称加载类路径,获取构造函数并调用它。我会以你为例。

考虑我有一个class:

com.crossedstreams.thingy.Foo

其中有签名的构造函数:

Foo(String a, String b);

我将基于这两个事实来实例化这个类,如下所示:

// Load the Class. Must use fully qualified name here!
Class clazz = Class.forName("com.crossedstreams.thingy.Foo");

// I need an array as follows to describe the signature
Class[] parameters = new Class[] {String.class, String.class};

// Now I can get a reference to the right constructor
Constructor constructor = clazz.getConstructor(parameters);

// And I can use that Constructor to instantiate the class
Object o = constructor.newInstance(new Object[] {"one", "two"});

// To prove it's really there...
System.out.println(o);

输出:

com.crossedstreams.thingy.Foo@20cf2c80

这里有很多资源详细介绍了这一点,你应该知道你正在引入一个编译器无法检查你的依赖项 - 如果你拼错了类名或任何东西,它将在运行时失败。此外,在此过程中可能会抛出不同类型的Exception。虽然这是一个非常强大的技术。

扫码关注云+社区