使用Class.forName()初始化一个类,该类具有一个带参数的构造函数
我正在实例化这样一个类。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
我怀疑的是,如果我们有一个构造函数,它接受参数如何像上面那样实例化它。
谢谢,
纳伦德拉
使用Class.getConstructor()
并在其上调用Constructor.newInstance()
。 例如,如果这是类Foo
上的构造函数:
public Foo(String bar, int baz) { }
你必须做这样的事情:
Constructor c = Class.forName("Foo").getConstructor(String.class, Integer.TYPE); Foo foo = (Foo) c.newInstance("example", 34);
您必须知道需要将哪些参数传递给构造函数。 如果这不可取,你应该考虑使用一个空的构造函数。 然后有方法来设置你通常传递给构造函数的东西。
有人可能会问你这里是否有正确的模式。 你真的需要使用reflection,也许有更好的方法吗? 如果你知道你将要投射到你的物体,为什么不正常建造呢? 您可能希望提供更多关于为什么需要执行此操作的上下文。 有正当理由,但您没有说明。
如果您正在选择要创建的对象类型,具体取决于string "fully qualified class name here"
那么您很可能也应该使用策略模式替换它。
newInstance()
始终调用默认构造函数。
如果要调用参数化构造函数,
- 您必须通过为
Class[]
的getDeclaredConstructor
方法传递Class[]
来获取带有参数类型的Constructor - 您必须通过传递
Object[]
来创建构造函数实例
构造函数的newInstance()
方法
看看示例代码。
import java.lang.reflect.*; class NewInstanceDemo{ public NewInstanceDemo(){ System.out.println("Default constructor"); } public NewInstanceDemo(int a, long b){ System.out.println("Two parameter constructor : int,long => "+a+":"+b); } public NewInstanceDemo( int a, long b, String c){ System.out.println("Three parameter constructor : int,long,String => "+a+":"+b+":"+c); } public static void main(String args[]) throws Exception { NewInstanceDemo object = (NewInstanceDemo)Class.forName("NewInstanceDemo").newInstance(); Constructor constructor1 = NewInstanceDemo.class.getDeclaredConstructor( new Class[] {int.class, long.class}); NewInstanceDemo object1 = (NewInstanceDemo)constructor1.newInstance(new Object[]{1,2}); } }
输出:
java NewInstanceDemo Default constructor Two parameter constructor : int,long => 1:2
有关更多详细信息,请查看oracle 文档页面。