javaSE

关于newInstance()方法有参数和无参数

2023-03-30  本文已影响0人  virtual灬zzZ
一、通过反射创建新的类实例的两种方式:

Class.newInstance()
Constructor.newInstance()

二、两种创建方式的比较:

Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造函数。

Class.newInstance() 要求被调用的构造函数是可见的,即必须是public的;
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数,需要通过setAccessible(true)实现。

三、代码示例:
package com.evan.reflect;
 
class Boy
{
    public Boy()
    {
        System.out.println("My name is evan.");
    }
    //设置构造方法私有
    private Boy(int age, String hobby)
    {
        System.out.println("I'm "+age+"year old.");
        System.out.println("I like "+hobby+".");
    }
}
package com.evan.reflect;
 
import java.lang.reflect.Constructor;
 
 
public class Test {
    
    public static void main(String []args) throws Exception
    {
        Class clazz=Class.forName("com.evan.reflect.Boy");
        //调用无参数构造
        Boy boyFirst=(Boy) clazz.newInstance();
 
 
        //调用有参数构造需要使用Constructor类对象
        //这种方式和下面这种方式都可以,注意第二种的参数类型是 new Class[]
        Constructor constructor=clazz.getDeclaredConstructor(int.class,String.class);
        //Constructor constructor=clazz.getDeclaredConstructor(new Class[]{int.class,String.class});
 
        //设置私有构造可以访问
        constructor.setAccessible(true);
 
        //这种方式和下面这种方式都可以,注意这里的参数类型是 new Object[]
        Boy boySecond=(Boy) constructor.newInstance(18,"programming");
        //Boy boySecond=(Boy) constructor.newInstance(new Object[] {18,"programming"});
    }
}
运行结果
My name is evan.
I'm 18year old.
I like programming.
上一篇 下一篇

猜你喜欢

热点阅读