使用类名称创建实例并调用构造函数| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接

原问题地址:stackoverflow.com/questions/6…

Q:

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

就像是下面这样的

Object object = createInstance("mypackage.MyClass","MyAttributeValue");
复制代码

其中 MyAttributeValue 是 MyClass 构造函数的参数。

A:

你可以像下面这样写:

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 对象,您需要使用 Class.forName(“ foo.Outer $ Nested”)

Other

#107

您可以使用 Class.forName() 获取所需类的Class对象。

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

最后,在该对象上调用 newInstance() 以获取新实例。

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
复制代码

#85

您可以使用反射

return Class.forName(className).getConstructor(String.class).newInstance(arg);
复制代码

#16

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

Class<?> myClass = Class.forName("com.example.MyClass");    
Constructor<?> constructor = myClass.getConstructors()[0];
复制代码

#9

使用 getConstructor(String.lang) 时,必须将构造方法声明为 public。否则,将引发 NoSuchMethodException。

如果要访问非公共构造函数,则必须改用 getDeclaredConstructor(String.lang)。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享