繁体   English   中英

我如何使用getConstructor(params).newInstance(args)?

[英]How do I use getConstructor(params).newInstance(args)?

这可能是一个愚蠢的问题,但我是Java的新手,所以......

我目前有一些代码,目前正在使用clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance()

我需要将一些参数传递给contructort,所以我想将其更改为: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)

我不明白的是我需要传递的是params以及我需要传递给args的东西

假设我想传入一个字符串“你好”和一些名为XyzObj的XYZ类型的对象。我将如何指定? 我会以params的形式通过什么,以及作为args传递给我的是什么?

在Java中,这称为反射

假设该类具有此构造函数,否则您将获得我相信的NoSuchMethod异常。

clazz.asSubclass(asSubclassOfClass)
    .getConstructor(String.class,XYZ.class)
    .newInstance("howdy",XyzObj);

由于您不熟悉Java,因此让我更轻松地为您提供帮助,以便您可以了解在执行此操作时会发生什么。

假设您有以下课程:

public class ParentClazz{
        String someVar;
    public ParentClazz(){
        someVar="test";
    }
    public ParentClazz(String someVar){
        System.out.println("I have been invoked");
        this.someVar=someVar;
    }
}

然后你有以下主要方法:

public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
           ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy");
    }

如果你运行它你会注意到控制台输出打印消息 - 我已被调用。 这意味着使用反射调用了ParentClazz的构造函数。

如果方案允许您使用标准对象创建过程,则可以执行相同的操作:

ParentClazz clazz = new ParentClazz("howdy");

希望这有助于您理解它。

以下是使用new关键字创建类的示例。 这些类将其他类作为基元和对象作为其参数。 该示例还显示了正在创建的子类和Parent类的实例

public class ConstructorInstantiateWithoutNew 
{
    @SuppressWarnings("rawtypes")
    public static void main( String [] args )
    {
        Class<Drinker> clazz_drinker = Drinker.class;
        Class [] paramTypes = { Fizz.class, Colour.class, int.class };
        Object [] paramValues = {  new Fizz(), new Colour(), new Integer(10) };

        Class<Drunk> clazz_drunk = Drunk.class;
        Class [] paramTypesSub = { Fizz.class, Colour.class, int.class, boolean.class };
        Object [] paramValuesSub = {  new Fizz(), new Colour(), new Integer(10), true };

        try 
        {
            Drinker drinker = clazz_drinker.getConstructor( paramTypes ).newInstance( paramValues );
            drinker.drink();

            Drunk drunk = clazz_drunk.getConstructor(paramTypesSub).newInstance(paramValuesSub);
            drunk.drink();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
    }
}

class Drinker
{
    int n;

    public Drinker( Fizz f, Colour c, int n)
    {
        this.n = n;
    }

    public void drink()
    {
        System.out.println( "Dad drank " + (n*10) + " ml");
    }
}

class Drunk extends Drinker
{
    boolean trouble;
    public Drunk(Fizz f, Colour c, int n, boolean inDogHouse)
    {
        super(f,c,n);
        trouble = inDogHouse;
    }

    public void drink()
    {
        System.out.println( 
                "Dad is Grounded: " + trouble + 
                " as he drank over "+ 
                (n*10) + " ml");
    }
}

class Fizz {} class Colour {}

希望这很有用

亲切的问候

Naresh Maharaj

clazz.asSubclass(asSubclassOfClass)
     .getConstructor(String.class, XYZ.class)
     .newInstance("howdy", XyzObj)

假设构造函数args按指定的顺序排列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM