有没有办法从Java中的String变量创建一个新类?
String className = "Class1";
//pseudocode follows
Object xyz = new className(param1, param2);
另外,如果可能,结果对象必须是Object?
类型可能有更好的方法,但我希望能够从XML文件中检索值,然后实例化以这些字符串命名的类。这些类中的每一个都实现相同的接口,并从同一个父类派生,因此我可以在该类中调用特定的方法。
答案 0 :(得分:111)
这是你想要做的:
String className = "Class1";
Object xyz = Class.forName(className).newInstance();
请注意,newInstance方法不允许使用参数化构造函数。 (见Class.newInstance documentation)
如果您确实需要使用参数化构造函数,那么您需要这样做:
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);
答案 1 :(得分:13)
是的,你可以在类路径上加载一个类,给定使用反射的String名称,使用Class.forName(name),抓取构造函数并调用它。我会给你一个例子。
考虑我有一个班级:
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
有很多资源可以详细介绍这个,你应该知道你引入了一个编译器无法检查的依赖项 - 如果你拼错了类名或任何东西,它会在运行时失败。 此外,在此过程中可能会抛出相当多的不同类型的异常。但这是一种非常强大的技术。
答案 2 :(得分:2)
这应该有效:
import java.lang.reflect.*;
FirstArgType arg1;
SecondArgType arg2;
Class cl = Class.forName("TheClassName");
Constructor con = cl.getConstructor(FirstArgType.class, SecondArgType.class);
Object obj = con.newInstance(arg1, arg2);
从那里你可以演员到一个已知的类型。
答案 3 :(得分:2)
在JDK7中,这对我来说更干净一点,而上面的答案比从新手角度来看要困难得多:(假设你已宣布' className'作为方法参数传递的String变量或使用此代码在方法中更早的传递:
Class<?> panel = Class.forName( className );
JPanel newScreen = (JPanel) panel.newInstance();
从这一点开始,您可以完全按照您希望的方式使用动态命名类中的属性/方法:
JFrame frame = new JFrame(); // <<< Just so no-one gets lost here
frame.getContentPane().removeAll();
frame.getContentPane().add( newScreen );
frame.validate();
frame.repaint();
上面其他答案中的示例在我尝试.add()新的&#39;对象&#39;键入框架的对象。这里显示的技术给了我一个可用的对象,上面只有那两行代码。
不确定为什么会这样 - 我自己就是一个Java新手。
答案 4 :(得分:0)
另一个:
import java.lang.reflect.Constructor;
public class Test {
public Test(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String toString() {
return this.name;
}
private String name;
public static void main(String[] args) throws Exception {
String className = "Test";
Class clazz = Class.forName(className);
Constructor tc = clazz.getConstructor(String.class);
Object t = tc.newInstance("John");
System.out.println(t);
}
}
答案 5 :(得分:0)
class
对象获取String
实例的示例程序。public class GetStudentObjectFromString
{
public static void main (String[] args) throws java.lang.Exception
{
String className = "Student"; //Passed the Class Name in String Object.
//A Object of Student will made by Invoking its Default Constructor.
Object o = Class.forName(className).newInstance();
if(o instanceof Student) // Verify Your Instance that Is it Student Type or not?
System.out.println("Hurrey You Got The Instance of " + className);
}
}
class Student{
public Student(){
System.out.println("Constructor Invoked");
}
}
输出: -
Constructor Invoked Hurrey You Got The Instance of Student