我想使用接受单个Class
参数的构造函数从其String
对象中实例化一个对象。
以下是一些接近我想要的代码:
Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();
但是,它实例化没有文本的JLabel
对象。我想使用接受字符串作为初始文本的JLabel
构造函数。有没有办法从Class
对象中选择特定的构造函数?
答案 0 :(得分:102)
Class.newInstance
调用no-arg构造函数(不带任何参数的构造函数)。要调用其他构造函数,您需要使用反射包(java.lang.reflect
)。
获取这样的Constructor
个实例:
Class<?> cl = Class.forName("javax.swing.JLabel");
Constructor<?> cons = cl.getConstructor(String.class);
对getConstructor
的调用指定您希望构造函数采用单个String
参数。现在创建一个实例:
Object o = cons.newInstance("JLabel");
你已经完成了。
P.S。只使用反射作为最后的手段!
答案 1 :(得分:12)
以下内容适合您。 试试这个,
Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel");
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);
答案 2 :(得分:3)
Class.forName("className").newInstance()
始终不调用默认构造函数。
调用参数化构造函数而不是零参数no-arg构造函数,
Constructor
中传递类型来获取Class[]
参数类型
适用于getDeclaredConstructor
Class
方法
Object[]
中传递值来创建构造函数实例
newInstance
Constructor
方法
醇>
示例代码:
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
答案 3 :(得分:1)
有时候,没有必要为要调用的类创建对象是构造函数和方法。您可以在不创建直接对象的情况下调用类的方法。用参数调用构造函数非常容易。
import java.lang.reflect.*;
import java.util.*;
class RunDemo
{
public RunDemo(String s)
{
System.out.println("Hello, I'm a constructor. Welcome, "+s);
}
static void show()
{
System.out.println("Hello.");
}
}
class Democlass
{
public static void main(String args[])throws Exception
{
Class.forName("RunDemo");
Constructor c = RunDemo.class.getConstructor(String.class);
RunDemo d = (RunDemo)c.newInstance("User");
d.show();
}
}
输出将是:
你好,我是一个构造函数。欢迎,用户
你好。
Class.forName(“RunDemo”); 将加载RunDemo类。
构造函数c = RunDemo.class.getConstructor(String.class); 构造函数类的getConstructor()方法将返回具有String作为Argument的构造函数,并将其引用存储在构造函数类的对象'c'。
RunDemo d =(RunDemo)c.newInstance(“User”); Constructor类的newInstance()方法将实例化RundDemo类并返回对象的Generic版本它通过使用类型转换转换为RunDemo类型。
RunDemo的对象'd'保存newInstance()方法返回的引用。