反射实例化对象
获取Class对象最大的意义是Class类里面提供有一个对象的反射实例化方法(代替了关键字new):
- 在JDK1.9以前的实例化:@Deprecated(since="9") public T newInstance() throws InstantiationException, IllegalAccessException
- JDK1.9后 :clazz.getDeclaredConstructor().newInstance()
范例:通过newInstance()实例化一个对象
- 创建Person类
package reflect; public class Person { Person(){ //无参构造 //任何情况下如果实例化对象则一定要调用类中的构造方法 System.out.println("Person类的构造方法"); } @Override public String toString(){ return "我是Person类"; } }
- 创建测试类
package reflect; public class Demo { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> cls = Class.forName("reflect.Person"); Object obj = cls.newInstance(); //实例化对象,JDK1.9后被废除 System.out.println(obj); //输出对象调用toString } }
【cls.newInstance()】Person类的构造方法
【System.out.println(obj)】我是Person类现在通过反射实现的对象实例化处理,依然要调用类中的无参构造方法,其本质等价于“类 对象 = new 类();”。相当于隐含了关键字new,而直接使用字符串进行了替代。
因为默认的Class类中的newIntance()方法只能够调用无参构造,所以很多开发者会认为其描述不准确,于是将其变换了形式,
package reflect;
public class Demo {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("reflect.Person");
Object obj = cls.getDeclaredConstructor().newInstance(); //实例化对象,JDK1.9后被废除
System.out.println(obj); //输出对象调用toString
}
}
其最后执行的结果是一样的