第一种:通过Object类的getClass方法
@Test public void test01() throws IllegalAccessException, InstantiationException { //new 对象 Date date = new Date(); System.out.println(date); //1.反射第一种方式,用自己找出自己,并创建自己 Date date1 = date.getClass().newInstance(); System.out.println(date1); System.out.println(date == date1); }
第二种:通过对象实例方法获取对象
@Test public void test02() throws IllegalAccessException, InstantiationException { //第二种:通过对象实例方法获取对象 Class<Date> dateClass = Date.class; System.out.println(dateClass); Date date = dateClass.newInstance(); System.out.println(date); }
第三种:通过Class.forName方式
@Test public void test03() throws IllegalAccessException, InstantiationException, ClassNotFoundException { //反射的第三种方式,用java的class根据类的出处创建对象 Class<Date> aClass = (Class<Date>) Class.forName("java.util.Date"); Date date = aClass.newInstance(); System.out.println(date); }
对于有空构造函数的类 可以直接用字节码文件获取实例:
Object o = clazz.newInstance(); // 会调用空参构造器 如果没有则会报错
对于没有空的构造函数的类则需要先获取到他的构造对象 在通过该构造方法类获取实例:
Constroctor constroctor = clazz.getConstructor(String. class , int . class ); // 获取构造函数 Object obj = constroctor.newInstance( "jack" , 18 ); // 通过构造器对象的newInstance方法进行对象的初始化
参考博客:https://blog.csdn.net/qq_27026603/article/details/78904248