Java反射之獲取類的相關信息學習筆記(一)

  Java反射是Java一個很重要的功能,剛開始學Java的時候學過這東西,當時不是很清楚,很多東西一知半解,現在回過頭來看感覺貌似突然豁然開朗,不過還是總結一下比較好,現在記得很清楚,過一段時間不用怕又是忘了。

  好,開寫。世間萬物皆是對象在Java領域,類也是一種對象,不過稱爲類對象,反射的主要作用就是動態獲取關於類的各種信息,也就是在運行期間獲取,在Java中類對象用Class來表示。

  每個類都有類對象,先總結一下獲取類對象的方式,一共有三種,一種是通過類名.class來獲取類對象,一種是通過類的對象調用getClass()來獲取,注意類對象和類的對象是兩個完全不同的概念,還有一個是通過指定類的全路徑名,調用Class.forName方法,以上三種效果都可以獲取一個類對象,具體直接看下圖,這裏提示一下,當使用Class.forName方法時,編譯期間不會去檢查這個指定參數對應的類是否存在,在運行期間纔會檢查,爲了嚴謹期間最好加上try catch來捕獲一下,這裏只是做個測試就簡單寫了

  這裏寫圖片描述

  獲取一個類的信息,簡單來說就是主要獲取類的方法,字段,以及構造方法,這些在Java中均有對應,分別是Method類,Field類,Constructor類。一個方法對應一個Method對象,一個類有多個方法就對應一個Method數組,同理,一個字段對應一個Field對象,一個構造方法對應一個Constructor對象,獲取類的這些信息的前提是先獲取類對象,寫了個代碼直接獲取關於一個類的這三種對象的名字信息,

  這裏寫圖片描述  

  簡單解釋一下,就是調用一個類對象的getXXX方法來獲取之後遍歷即可,這裏就不貼Student類了,直接看控制檯輸出即可,這樣你就通過反射在僅僅知道類名的情況下獲得類的詳細信息

  這裏寫圖片描述  

  注意這裏調用獲取方法和字段的時候加上了Declared這個修飾詞,是獲取僅存在於當前類的方法以及字段信息,不包括來自父類的,如果去掉這個修飾詞,那麼就是獲取包括從父類繼承過來的方法以及字段,這裏僅僅對方法做個測試瞭解一下即可,見下圖

  這裏寫圖片描述

  輸出的信息是下面這個
  

類class com.fanshe.test.Student的所有方法名稱爲:
getName
setName
setSex
setAge
getAge
getSex
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll

  接下里是關於方法,一個方法通過反射可以獲得的信息包括方法名,方法返回類型以及方法帶的所有參數類型,是不是感覺很強大哈哈,獲取方法名很簡單,獲取方法的返回值類型前提是需要先獲取方法的返回值類型的Class對象 ,直接上代碼
這裏寫圖片描述

  
  關於獲取方法參數,首先這裏創建一個Person對象,見下面
  

public class Person {
    private String first="zhang";
    private String last="san";
    public void eat(int a1, int b1) {

    }

    public void drink(float a1, int b1) {

    }

    public void sleep(int a1, double b1) {

    }
    public void walk(){

    }
}

  之後編寫一個方法來獲取這個類的方法的參數信息,簡單來說就是調用Method對象的getParameterTypes方法獲取方法參數數組之後遍歷調用getName方法拼接字符串即可,直接看下面代碼,這裏爲了簡單起見,只獲取當前類的方法參數列表信息,當然如果你願意可以獲取包括他父類的方法參數列表信息
  這裏寫圖片描述

  對應的控制檯輸出爲
  這裏寫圖片描述

  利用反射還可以在僅僅知道類名的情況下獲取關於這個類的成員變量的名稱對應的默認value

  這裏先創建一個Phone類,見下面
  

public class Phone {
   private String name="小米MIX2";
   private int price=3999;
   private double safe=99;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getPrice() {
    return price;
}
public void setPrice(int price) {
    this.price = price;
}
public Phone() {
    super();
}

}

接下來造輪子,這裏編了兩個方法,接受的參數分別是普通Object對象和類對象,最終實現的效果都一樣,根據實際情況去選擇即可,這裏只補充說一下,如果在僅僅知道類對象的情況下去創建一個類的對象,可以通過Class.forName(“xxx”).newInstance方法來創建一個類的對象,這類newInstance方法實際是調用了類的無參構造函數去創建對象,如果指定的類沒有這個構造方法就會報錯,這裏注意一下。直接上代碼。。見下圖

  這裏寫圖片描述

  對應的控制檯輸出見下
  這裏寫圖片描述

  上面這些只不過整理總結了一些常見的Java反射的可能用到的場景,還有一些東西沒寫上,不過都是大同小異罷了,先寫這些以後有機會再補充好了,睡覺。。。。明天回家

  以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章