反射課堂筆記(mu課)
1.類是物件,類是java.lang.class類的實列物件
任意一個類都是class的例項物件,這個例項物件有三種表示方式
class Foo{};
public class ClassDemo1 {
public static void main(String[] args){}
FOO foo2=new Foo();
//Foo這類,也是一個例項物件,Class類的例項物件,如何表達呢
//任意一個類都是class的例項物件,這個例項物件有三種表示方式
//.第一種:實際在告訴我們任意一個類都有一個隱藏的靜態成員變數Class
Class c1=Foo.class;
//.第二種:已經知道類的物件,通過getClass方法
Class c2= foo2.getClass();
c1,c2表示了Foo類的型別。即使萬事萬物皆物件,類也是物件,是Class的例項物件,這個物件我們成為該類的類型別。
不管c1或是c2都代表了FOO類的類型別,一個類只肯能是Class類的一個例項物件
//第三種 得拋異常
Class c3=null
c3=Class.forName("包名類名")
//我們可以通過類的類型別建立該類的物件例項
Foo foo=(Foo)c1.newInstance();//需要有無參的構造方法}
2.Class.forName("l類的全稱")
不僅表示類的類型別,還代表了動態載入類
new建立物件,是靜態載入類,在編譯時刻就需要載入所以可能使用的類,不好,通過動態載入可解決該問題
動態載入類,在運動時刻載入。
3.基本的資料型別 void關鍵字 都存在類型別
Class c1=int.class // int的類型別
4.public static void printClassMessage(Object obj){
//要獲取類資訊,首先要獲取類的類型別
Class c=obj.getClass();//傳遞的是那個子類,c就是該類的類型別
//method 類,方法的物件
//一個成員方法就是一個method物件
//getMethods()方法獲取的是所有public的函式,包括父類繼承而來的
//getDeclaredMethod()獲取的是所有該類自己申明的方法,不問訪問許可權
}
Method [] ms=c.getMethods();//或是c.getDeclaredMethod()
Clsaa returnType=ms[i].getReturnType();///得到方法的返回值型別的類型別
Class[]paramTypes=ms[i].getParameterType();//得到的引數的類型別
5.
//成員變數也是物件
//java.lang.reflect.field
//Field類封裝了關於成員變數的操作
//getField()方法獲取的是所有public的成員變數的資訊
//getDeclaredField獲取的是該類自己申明的成員變數的資訊
Field [] fs =c.getFields();
Class fieldType =field.getType();//得到的是成員變數的類型別 如果是int型別,得到是 int.class
field.getName//得到是成員變數的名稱
6.建構函式也是物件
java.lang.Constructor中封裝了建構函式的資訊
getConstructors獲取的是所有Public的建構函式
getDeclaredConstructors得到是所有建構函式
constructor[] cs =c.getDeclaredConstructors()
7 . //如何獲取某個方法
//方法的名稱和方法的引數列表才能唯一決定某個方法.方法反射操作
method.invoke(物件,引數列表)
A a1 =new A();
Class c= a1.getClass();
Method m=c.getMethod("print",new class[]{int.class,int.class})
或是Method m=c.getMethod("print",int.class,int.class);
//方法的反射操作是用M物件來進行方法呼叫,和a1.print1呼叫的效果完全相同
方法如果沒有返回值返回null,有返回值返回具體的返回值
object o=m.invoke(a,object[]{10,20});