使用接受字符串参数的构造函数实例化一个类对象?

时间:2010-08-26 10:09:19

标签: java html reflection constructor

我想使用接受单个Class参数的构造函数从其String对象中实例化一个对象。

以下是一些接近我想要的代码:

Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();

但是,它实例化没有文本的JLabel对象。我想使用接受字符串作为初始文本的JLabel构造函数。有没有办法从Class对象中选择特定的构造函数?

4 个答案:

答案 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构造函数,

  1. 您必须通过在Constructor中传递类型来获取Class[]参数类型 适用于getDeclaredConstructor
  2. Class方法
  3. 您必须通过在Object[]中传递值来创建构造函数实例 newInstance
  4. 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()方法返回的引用。