上一篇:Class类对象的三种实例化模式 | 带你学《Java语言高级特性》之八十一
【本节目标】
通过实际开发中的案例进行程序的说明,来进一步理解反射的核心意义。
经过一系列分析之后可以发现虽然获得了Class类的实例化对象,但是依然觉得这个对象获取的意义不是很大,所以为了进一步理解反射的核心意义,下面将通过几个案例进行程序的说明(都是实际开发中一定会使用到的)。
反射实例化对象
获取Class对象后最大意义实际上并不是在于只是一个对象的实例化操作形式,更重要的是Class类中提供了一个对象的反射实例化方法(代替了关键字new):
在JDK1.9以前的实例化:
@Deprecated(since="9")
public T newInstance() throws InstantiationException, IllegalAccessException
在JDK1.9之后的实例化:
clazz.getDeclaredConstructor().newInstance()
范例:通过newInstance()方法实例化Person类对象
package cn.mldn.vo;
public class Person {
//任何情况下如果要实例化类对象,一定要调用类中的构造方法
public Person(){ //无参构造方法
System.out.println("*********** Person类构造方法 ************");
}
@Override
public String toString() {
return "我是一个人,一个脱离了低级趣味的好人!";
}
}
package cn.mldn.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Class<?> cls=Class.forName("cn.mldn.vo.Person");
Object obj= cls.newInstance(); //实例化对象,JDK1.9后被废除了
System.out.println(obj); //输出对象调用toString()方法
/**
* *********** Person类构造方法 ************
* 我是一个人,一个脱离了低级趣味的好人!
*/
}
}
现在通过反射实现的对象实例化处理,依然要调用类中的无参构造方法,其本质等价于“类 对象 = new 类()”,相当于隐含了关键字new,而直接使用字符串进行了替代。
范例:使用getDeclaredConstructor().newInstance()进行对象实例化
package cn.mldn.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Class<?> cls=Class.forName("cn.mldn.vo.Person");
Object obj= cls.getDeclaredConstructor().newInstance(); //实例化对象,JDK1.9废除了
System.out.println(obj);
/**
* *********** Person类构造方法 ************
* 我是一个人,一个脱离了低级趣味的好人!
*/
}
}
从JDK1.9后,newInstance()被替代了,因为默认的Class类中的newInstance()方法只能调用无参构造,所以很多开发者会认为其描述的不准确,于是将其变换了形式(构造方法会讲解)。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学