一、通过反射创建新的类实例的两种方式:
- 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
查看评论