从Java中的字符串创建新对象

时间:2009-08-12 21:27:42

标签: java

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

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

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

类型

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

6 个答案:

答案 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);

请参阅Constructor.newInstance documentation

答案 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