1. 程式人生 > >反射課堂筆記(mu課)

反射課堂筆記(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});