The*_*mer 299 java reflection instantiation
有没有办法在给定类名(动态)的情况下创建特定类的实例,并将参数传递给其构造函数.
就像是:
Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Run Code Online (Sandbox Code Playgroud)
哪个"MyAttributeValue"是构造函数的参数MyClass.
Jon*_*eet 482
是的,像是这样的:
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });
Run Code Online (Sandbox Code Playgroud)
当然,这只适用于单个字符串参数,但您可以非常轻松地修改它.
请注意,类名必须是完全限定的类名,即包含名称空间.对于嵌套类,您需要使用一美元(就像编译器使用的那样).例如:
package foo;
public class Outer
{
public static class Nested {}
}
Run Code Online (Sandbox Code Playgroud)
要获得该Class对象,您需要Class.forName("foo.Outer$Nested").
Joa*_*uer 93
您可以使用Class.forName()获取Class所需类的对象.
然后getConstructor()用来找到所需的Constructor对象.
最后,调用newInstance()该对象来获取新实例.
Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
Run Code Online (Sandbox Code Playgroud)
Pet*_*rey 80
你可以使用反射
return Class.forName(className).getConstructor(String.class).newInstance(arg);
Run Code Online (Sandbox Code Playgroud)
小智 13
如果类只有一个空构造函数(如Activity或Fragment等,android类):
Class<?> myClass = Class.forName("com.example.MyClass");
Constructor<?> constructor = myClass.getConstructors()[0];
Run Code Online (Sandbox Code Playgroud)
当使用(即)时getConstructor(String.lang),必须将构造函数声明为public.否则NoSuchMethodException抛出一个.
如果要访问非公共构造函数,则必须使用(即)getDeclaredConstructor(String.lang).
小智 6
如果有人正在寻找一种方法来创建类的实例,尽管该类遵循单例模式,那么这里有一种方法。
// 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();
Run Code Online (Sandbox Code Playgroud)
这只适用于使用私有构造函数实现单例模式的类。
另一个有用的答案。如何使用 getConstructor(params).newInstance(args)?
return Class.forName(**complete classname**)
.getConstructor(**here pass parameters passed in constructor**)
.newInstance(**here pass arguments**);
Run Code Online (Sandbox Code Playgroud)
就我而言,我的类的构造函数采用 Webdriver 作为参数,因此使用以下代码:
return Class.forName("com.page.BillablePage")
.getConstructor(WebDriver.class)
.newInstance(this.driver);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
416457 次 |
| 最近记录: |