反射之中所有的核心操作都是通過Class類對象展開的,可以說Class類是反射操作的根源所在,但是這個類的實例化對象,
可以采用三種方式完成。
java.lang.Class類的定義:
public final class Class<T> extends Object implements Serializable, GenericDeclaration, Type, AnnotatedElement, TypeDescriptor.OfField<Class<?>>, Constable
1.Object類支持:
Object類可以根據實例化對象獲取Class對象:public final Class<?> getClass()
這種方式有一個缺點:如果現在只是想獲得Class類對象,則必須產生指定類對象后才可以獲得,會造成一個無用的對象產生
代碼:
Person per = new Person();//已經存在有指定類的實例化對象 Class<? extends Person> cls = per.getClass();
2.JVM直接支持:
采用“類.class”的形式實例化
代碼:
Class<? extends Person> cls2 = Person.class;
3.Class類支持:
在Class類里面提供有一個static方法:
- 加載類:public static Class<?> forName(String className) throws ClassNotFoundException
這種模式最大的特點是可以直接采用字符串的形式定義要使用的類型,並且程序不需要編寫任何的import程序
注意:使用該方法時參數必須是完整類名,如以下代碼中IOtest為包名,InputUtil是類名
Class<?> cls3 = Class.forName("IOtest.InputUtil");
完整代碼:
package Reflect; public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub // 1、Object類支持 Person per = new Person();//已經存在有指定類的實例化對象 Class<? extends Person> cls = per.getClass(); System.out.println(per); System.out.println(cls.getName());//獲取的是類的完整名稱 // 2、JVM直接支持 Class<? extends Person> cls2 = Person.class; System.out.println(cls2.getName()); // 3、Class類支持 Class<?> cls3 = Class.forName("IOtest.InputUtil");//不需要用import導入IOtest包 System.out.println(cls3.getName()); } } class Person{}
獲取Class對象之后最大的意義實際上並不是在於這是一個對象,更重要的是Class類里面提供有一個對象的
反射實例化方法(代替了關鍵字new):
在jdk1.9以前的實例化:public T newInstance() throws InstantiationException,IllegalAccessException
jdk1.9之后:clazz.getDeclaredConstructor().newInstance()
通過反射實現的對象實例化處理,依然要調用類中的無參構造方法,其本質等價於“類 對象 = new 類()”,也就是說相當於隱藏了關鍵
字new,而直接使用字符串進行了替代
代碼實例:
/* * 通過newInstance()方法實例化Student類對象 */ package Reflect; public class ReflectDemo2 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Class<?> cls = Class.forName("mldn.Student"); Object obj = cls.newInstance();//實例化對象,jdk1.9后被廢除 System.out.println(obj); //jdk1.9之后:被clazz.getDeclaredConstructor().newInstance()替代 Object o = cls.getDeclaredConstructor().newInstance(); System.out.println(o); } }