Java 如何创建在运行时已知的类的实例?

Java 如何创建在运行时已知的类的实例?,java,reflection,Java,Reflection,我们如何创建具有参数化的类的对象 构造函数,类的名称将在 运行时作为命令行参数 这条线是什么意思 新类[]{String.Class} String和String.class的区别是什么 Class c=Class.forName(args[0]) 这将获取一个类对象 构造函数ctr=c.getDeclaredConstructor(新类[]{String.Class}) 这个类得到一个构造函数,它的参数是一个字符串 一旦有了它,您就可以调用ctr.newInstance(someString)

我们如何创建具有参数化的类的对象 构造函数,类的名称将在 运行时作为命令行参数

  • 这条线是什么意思

    新类[]{String.Class}

  • String和String.class的区别是什么

  • Class c=Class.forName(args[0])

    这将获取一个
    对象

    构造函数ctr=c.getDeclaredConstructor(新类[]{String.Class})

    这个类得到一个构造函数,它的参数是一个字符串

    一旦有了它,您就可以调用
    ctr.newInstance(someString)

    不过你有个问题,因为你并不真正了解这里的班级。您至少应该了解一个常见的子类型,否则您将得到一个JavaDoc非常清楚的
    对象

    返回一个
    构造函数
    对象,该对象反映由该
    对象表示的类或接口的指定构造函数。
    parameterTypes
    参数是一个
    Class
    对象数组,这些对象按声明的顺序标识构造函数的形式参数类型

    。。。因此,在您的例子中,它得到了一个
    构造函数
    对象,该对象用一个参数表示一个构造函数,它是
    字符串
    新类[]{String.Class}
    构造了一个
    类[]
    ,其中一个条目是
    对象,表示
    java.lang.String
    )。您可以对该对象调用
    newInstance(“某些字符串”)
    ,以便调用构造函数并返回目标类的新实例


    实际上,您可能需要使用
    getConstructor
    而不是
    getDeclaredConstructor
    ,因为后者将返回与指定参数类型匹配的任何构造函数,包括通常无法从外部访问的构造函数(例如
    private
    构造函数)。相反,
    getConstructor
    将只返回
    public
    构造函数。

    1-要在运行时使用反射创建类实例:

    Class classToInstantiate = Class.forName(className);
    Constructor<?> theClassInstructor = classToInstantiate.getDeclaredConstructor(<parametersClasses>);
    Object instance = theClassInstructor.newInstance(<parameters>);
    
    Class classtoinstate=Class.forName(className);
    构造函数theClass讲师=classtoinstate.getDeclaredConstructor();
    对象实例=Class讲师.newInstance();
    
    与:

    • parameters评估构造函数参数类的数组,例如,如果构造函数使用字符串和您编写的整数参数:
      getDeclaredConstructor(新类[]{String.Class,Integer.Class})
    • 参数
      是实例化时要使用的参数的实际值

    第二个问题似乎是对第一个问题的回答。您只需添加
    ctr.newInstance(参数)
    。但是,有人能解释一下第二个问题中发生了什么吗……完全令人困惑您看过这些方法的文档吗?这是什么(新类[]{String.Class})?你能解释一下为什么我们要写类[]{String.Class,Integer.Class}?
    新类[]{}
    创建和数组
    类型的对象。这些对象表示类(例如字符串)。
    Class[]{String.Class,Integer.Class}
    然后创建两个类对象的数组:-第一个是String类的Class对象-第二个是Integer类的Class对象e.g要实例化汽车,我需要门的数量和汽车品牌名称,所以我的构造函数应该看起来像
    公共汽车(String brandName,Integer doors)
    ,所以我的构造函数需要
    字符串和
    整数,这意味着我的构造函数是
    汽车(String.class,Integer.class)
    。因此,在使用反射API时,必须将这两种参数类型指定为数组,如
    Class[]{String.Class,Integer.Class}