使用接受string参数的构造函数实例化一个类对象?
我想从它的Class
对象实例化一个对象,使用接受一个String
参数的构造函数。
这是一些代码,接近我想要的:
Object object = null; Class classDefinition = Class.forName("javax.swing.JLabel"); object = classDefinition.newInstance();
但是,它没有文本实例化JLabel
对象。 我想使用接受一个string作为初始文本的JLabel
构造函数。 有没有办法从一个Class
对象中select一个特定的构造函数?
Class.newInstance
调用无参数构造函数(不带任何参数的构造函数)。 为了调用不同的构造函数,你需要使用reflection包( java.lang.reflect
)。
获取像这样的Constructor
实例:
Class<?> cl = Class.forName("javax.swing.JLabel"); Constructor<?> cons = cl.getConstructor(String.class);
对getConstructor
的调用指定您需要带有一个String
参数的构造函数。 现在创build一个实例:
Object o = cons.newInstance("JLabel");
你完成了。
PS只使用reflection作为最后的手段!
以下将为你工作。 尝试这个,
Class[] type = { String.class }; Class classDefinition = Class.forName("javax.swing.JLabel"); Constructor cons = classDefinition .getConstructor(type); Object[] obj = { "JLabel"}; return cons.newInstance(obj);
Class.forName("className").newInstance()
总是调用没有参数的默认构造函数。
要调用参数化构造函数而不是零参数no-arg构造函数,
- 您必须通过在
Class[]
为Class
getDeclaredConstructor
方法传递types来获取具有参数types的Constructor
函数 - 您必须通过在
Object[]
传递值来创build构造函数实例
Constructor
newInstance
方法
示例代码:
import java.lang.reflect.*; class NewInstanceWithReflection{ public NewInstanceWithReflection(){ System.out.println("Default constructor"); } public NewInstanceWithReflection( String a){ System.out.println("Constructor :String => "+a); } public static void main(String args[]) throws Exception { NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance(); Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class}); NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"}); } }
输出:
java NewInstanceWithReflection Default constructor Constructor :String => StackOverFlow