小言_互联网的博客

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

396人阅读  评论(0)

一、通过反射创建新的类实例的两种方式: 

  • 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.

 

 


转载:https://blog.csdn.net/qq_41378597/article/details/102486128
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场