首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用getConstructor(params).newInstance(args)?

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

Stack Overflow用户
提问于 2012-02-17 21:16:06
回答 3查看 67.4K关注 0票数 30

这可能是个愚蠢的问题,但我对Java并不熟悉,所以.

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

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

我不明白的是,我需要作为params传入什么,以args的身份传递什么。

假设我想传递一个字符串"howdy“,并输入一些名为XyzObj in的XYZ类型的对象。我该如何具体说明呢?WHat,我会作为仿射传递,而作为args,我会传递什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-17 21:28:26

在Java中,这被称为反射

假设类有这个构造函数,否则您将得到一个NoSuchMethod异常。

代码语言:javascript
复制
clazz.asSubclass(asSubclassOfClass)
    .getConstructor(String.class,XYZ.class)
    .newInstance("howdy",XyzObj);

既然您是Java新手,那么让我给您一个更简单的方法,这样您就可以了解这样做时引擎盖下发生了什么。

假设您有以下类:

代码语言:javascript
复制
public class ParentClazz{
        String someVar;
    public ParentClazz(){
        someVar="test";
    }
    public ParentClazz(String someVar){
        System.out.println("I have been invoked");
        this.someVar=someVar;
    }
}

然后有以下主要方法:

代码语言:javascript
复制
public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
           ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy");
    }

如果您运行此操作,您将注意到控制台输出的打印消息-I已被调用。这意味着使用反射调用了ParentClazz的构造函数。

如果场景允许您使用标准对象创建过程,您可以做同样的事情:

代码语言:javascript
复制
ParentClazz clazz = new ParentClazz("howdy");

希望这能帮你理解。

票数 47
EN

Stack Overflow用户

发布于 2013-10-24 15:36:44

下面是一个不使用新关键字创建类的示例。这些类接受其他类,包括原语和对象作为它们的参数。该示例还显示了正在创建的子类和父类的实例。

代码语言:javascript
复制
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 {}

希望这是有用的

亲切的问候

纳雷什·马哈拉

票数 8
EN

Stack Overflow用户

发布于 2012-02-17 21:22:40

代码语言:javascript
复制
clazz.asSubclass(asSubclassOfClass)
     .getConstructor(String.class, XYZ.class)
     .newInstance("howdy", XyzObj)

,它假定构造函数args按照指定的顺序运行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9335515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档