反射機(jī)制
- 什么是動(dòng)態(tài)語言?
當(dāng)程序運(yùn)行時(shí),允許改變程序結(jié)構(gòu)或變量類型,這種語言叫做動(dòng)態(tài)語言,比如python。
但是Java并不是一種動(dòng)態(tài)語言,但是它有一套非常突出的動(dòng)態(tài)相關(guān)機(jī)制,叫做reflection
Class類
- Java中不是對象的東西?
Static修飾的東西,屬于類
普通的數(shù)據(jù)類型,如int、char等
其他的都是對象,連類本身,也是java.lang.Class的對象 - 任何一個(gè)類都是Class類的實(shí)例化對象,這種實(shí)例化對象有三種表達(dá)方式:
F f = new F() ;
Class c1 = F.class; //1. 任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量class
Class c2 = f.getClass(); //2. 已知該類的對象的情況下,通過getClass()方法獲取
Class c3 = null;
C3 = Class.forName(“com.text.F”); //3. 類的全稱
- 通過類的類類型創(chuàng)建該類的對象實(shí)例:
Foo foo = (Foo) c1.getNewInstance()
方法的反射
- Class有一個(gè)最簡單的方法,getName()
- Method類:所有方法是Method類的對象
- 通過方法的反射的相關(guān)步驟:
獲取該類的類類型
通過該類類型獲取該類的方法
循環(huán)遍歷所獲取到的方法
通過這些方法的getReturnType得到返回值類型的類類型,又通過該類類型得到返回值的名字
getName()得到方法的名稱,getParameterTypes()獲得這個(gè)方法里面的參數(shù)類型的類類型
成員變量的反射
成員變量是java.lang.reflect.Field類的對象,通過getFields()方法獲取所有public的成員變量的信息,通過getDeclaredFields()獲取自己聲明的成員變量
構(gòu)造函數(shù)的放射
構(gòu)造函數(shù)是Constructor類的對象
Class c = obj.getClass();
Constructor[] cs = c.getDeclaredConstructors();
Class[] paramTypes = constructor.getParameterTypes();
Class類的動(dòng)態(tài)加載類
編譯時(shí)刻加載的類是靜態(tài)加載,運(yùn)行時(shí)刻加載的類是動(dòng)態(tài)加載。需要的時(shí)候再生成
Stand s = (Stand) cl.newInstance();
Class B implements Stand{
Public void start(){
System.out.print("B...satrt");}}