使用类名创建一个实例并调用构造函数

有没有一种方法可以在给定的类名(动态)下创建一个特定类的实例并向其构造函数传递参数。

比如说

Object object = createInstance("mypackage.MyClass","MyAttributeValue");

其中"MyAttributeValue"是`MyClass'构造函数的一个参数。

解决办法

是的,类似的东西。

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

当然,这只对单个字符串参数有效,但你可以很容易地修改它。

注意,类名必须是完全限定的,即包括命名空间。对于嵌套类,你需要使用美元(因为这是编译器使用的)。比如说

package foo;

public class Outer
{
    public static class Nested {}
}

要获得这个 "类 "对象,你需要Class.forName("foo.Outer$Nested")

评论(17)

你可以使用Class.forName()来获得一个所需类的Class对象。

然后使用 getConstructor() 找到所需的 Constructor 对象。

最后,在该对象上调用newInstance()来获得新的实例。

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
评论(0)

你可以使用反射

return Class.forName(className).getConstructor(String.class).newInstance(arg);
评论(2)

如果类中只有一个空的构造函数(如Activity或Fragment等,android类)。

Class<?> myClass = Class.forName("com.example.MyClass");    
Constructor<?> constructor = myClass.getConstructors()[0];
评论(1)

当使用(即)getConstructor(String.lang)时,构造函数必须被声明为公共的。 否则会产生一个NoSuchMethodException

如果你想访问一个非公共的构造函数,你必须使用(即)getDeclaredConstructor(String.lang)

评论(0)

你要使用[java.lang.reflect.Constructor.newInstance(Object...)][1] 。

[1]: http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Constructor.html#newInstance%28java.lang.Object...%29

评论(0)

在Java中使用Class<?>用构造函数参数创建对象的简单方法:

案例1:- 这里,是这个 "Main "类中的一个小代码。

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Main {

    public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

        // Get class name as string.
        String myClassName = Base.class.getName();
        // Create class of type Base.
        Class<?> myClass = Class.forName(myClassName);
        // Create constructor call with argument types.
        Constructor<?> ctr = myClass.getConstructor(String.class);
        // Finally create object of type Base and pass data to constructor.
        String arg1 = "My User Data";
        Object object = ctr.newInstance(new Object[] { arg1 });
        // Type-cast and access the data from class Base.
        Base base = (Base)object;
        System.out.println(base.data);
    }

}

而且,这里是Base类的结构。

public class Base {

    public String data = null;

    public Base() 
    {
        data = "default";
        System.out.println("Base()");
    }

    public Base(String arg1) {
        data = arg1;
        System.out.println("Base("+arg1+")");
    }

}

情况2:-你,可以对有多个参数的构造函数和复制构造函数进行类似的编码。 例如,将3个参数作为参数传递给Base构造函数,就需要在类中创建构造函数,并将上面的代码改为:{{{9221085}}。

Constructor<?> ctr = myClass.getConstructor(String.class, String.class, String.class);
Object object = ctr.newInstance(new Object[] { "Arg1", "Arg2", "Arg3" }); 

而这里的Base类应该是这样的。

public class Base {

    public Base(String a, String b, String c){
        // This constructor need to be created in this case.
    }   
}

注意:- *不要忘记处理代码中需要处理的各种异常。

评论(1)

你也可以在创建的对象中调用方法。

您可以通过调用第一个约束器来创建对象即时,然后在创建的对象中调用第一个方法。

    Class<?> c = Class.forName("mypackage.MyClass");
    Constructor<?> ctor = c.getConstructors()[0];
    Object object=ctor.newInstance(new Object[]{"ContstractorArgs"});
    c.getDeclaredMethods()[0].invoke(object,Object... MethodArgs);
评论(4)

另一个有用的答案。 如何使用getConstructor(params).newInstance(args)?

return Class.forName(**complete classname**)
    .getConstructor(**here pass parameters passed in constructor**)
    .newInstance(**here pass arguments**);

在我的例子中,我的类'的构造函数将Webdriver作为参数,所以使用了以下代码。

return Class.forName("com.page.BillablePage")
    .getConstructor(WebDriver.class)
    .newInstance(this.driver);
评论(0)

如果有人正在寻找一种方法来创建一个类的实例,尽管该类遵循Singleton模式,这里有一种方法。

// Get Class instance
Class<?> clazz = Class.forName("myPackage.MyClass");

// Get the private constructor.
Constructor<?> cons = clazz.getDeclaredConstructor();

// Since it is private, make it accessible.
cons.setAccessible(true);

// Create new object. 
Object obj = cons.newInstance();

这只适用于使用私有构造函数实现单人模式的类。

评论(0)