Java 反射學(xué)習(xí)筆記(一)認(rèn)識(shí)Class

一、認(rèn)識(shí)Class
要想理解反射,首先要了解什么是類(lèi)型信息。
Java讓我們?cè)谶\(yùn)行時(shí)識(shí)別對(duì)象和類(lèi)的信息,主要有2種方式:
一種是傳統(tǒng)的RTTI,它假定我們?cè)诰幾g時(shí)已經(jīng)知道了所有的類(lèi)型信息;
另一種是反射機(jī)制,它允許我們?cè)谶\(yùn)行時(shí)發(fā)現(xiàn)和使用類(lèi)的信息。

  • RTTI:(Run-Time Type Identification),通過(guò)運(yùn)行時(shí)類(lèi)型信息程序能夠使用基類(lèi)的指針或引用來(lái)檢查這些指針或引用所指的對(duì)象的實(shí)際派生類(lèi)型。
  1. Class類(lèi)的使用
    1.1 Class對(duì)象是什么?
    Class 類(lèi)是在Java語(yǔ)言中定義一個(gè)特定類(lèi)的實(shí)現(xiàn)。一個(gè)類(lèi)的定義包含成員變量,成員方法,還有這個(gè)類(lèi)實(shí)現(xiàn)的接口,以及這個(gè)類(lèi)的父類(lèi)。Class類(lèi)的對(duì)象用于表示當(dāng)前運(yùn)行的 Java 應(yīng)用程序中的類(lèi)和接口。 比如:每個(gè)數(shù)組均屬于一個(gè) Class 類(lèi)對(duì)象,所有具有相同元素類(lèi)型和維數(shù)的數(shù)組共享一個(gè)Class 對(duì)象?;镜?Java 類(lèi)型(boolean, byte, char, short,int, long, float 和 double) 和 void 類(lèi)型也可表示為 Class 對(duì)象。

類(lèi)是對(duì)象,類(lèi)是java.lang.Class類(lèi)的實(shí)例對(duì)象

任何一個(gè)類(lèi)都是 Class 的實(shí)例對(duì)象,這個(gè)實(shí)例對(duì)象有三種表示方法:

  1. 通過(guò) 類(lèi).class 獲取
  2. 通過(guò) 實(shí)例對(duì)象.getclass()獲取
  3. 通過(guò) Class.forName(全類(lèi)名)獲取。

第一種 類(lèi)名.class --> 這表示任何一個(gè)類(lèi)都有一個(gè)隱含的靜態(tài)成員變量class
比如我們先創(chuàng)建一個(gè)類(lèi) Fish

public class Fish {
    public void say(){
        System.out.println("冒個(gè)泡");
    }
}

那么第一種創(chuàng)建方式:

public class Main {
    public static void main(String[] args) {
    // 第一種創(chuàng)建方式
        Class fishClass_1 = Fish.class;
}

第二種創(chuàng)建方式:
通過(guò)已知該類(lèi)的對(duì)象,通過(guò) getClass 方法 獲取該類(lèi)

// 拿到 類(lèi)Fish 的實(shí)例對(duì)象 fish
Fish fish = new Fish();
// 通過(guò) 實(shí)例對(duì)象 fish 獲取到 Fish的類(lèi)類(lèi)型。
Class fishClass_2 = fish.getClass();

第三種創(chuàng)建方式:
通過(guò) Class.forName("該類(lèi)的全路徑");

  Class fishClass_3 = null;
        try {
            fishClass_3 = Class.forName("com.study.reflection.Fish");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

這樣,我們就獲取到了類(lèi)的類(lèi)類(lèi)型。

我們可以通過(guò)類(lèi)的類(lèi)類(lèi)型來(lái)創(chuàng)建該類(lèi)的實(shí)例,使用class..newInstance();

   try {
            // 前提是要有無(wú)參的構(gòu)造方法
            Fish f = (Fish) fishClass_1.newInstance();
            f.say();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

打印結(jié)果:

冒個(gè)泡

文章鏈接:
Java 反射學(xué)習(xí)筆記(一)認(rèn)識(shí)Class
java 反射學(xué)習(xí)筆記(二)方法的反射
java 反射學(xué)習(xí)筆記(三)通過(guò)反射機(jī)制,繞過(guò)編譯時(shí)泛型檢測(cè)
java 反射學(xué)習(xí)筆記(四)反射的基本操作和用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容