java反射之Class初級用法

Class類

Class類的實例表示java應用運行時的類或接口(每個java類在運行的時候都會在JVM裏表現爲一個Class對象,可以通過類名.Class類型.getClass()Class.forName("包.類名")等方法獲取Class對象)

Class類的特點

Class類的父類是Object,事實上,任何java類,不管是jdk裏面的還是自定義的,都是Class類的對象,同時,所有的數據類型、關鍵字、方法等等,一切的一切都是Class類的對象。這是前提,很關鍵

Class類的運行原理

java種創建對象時不是通過類直接創建的,一個類的對象被創建之前,首先JVM會加載該類的字節碼文件(.class文件),也就是編譯後的java程序文件;加載完成後,JVM會自動的爲該類創建自己的Class對象,再通過Class對象創建目標對象

使用Class的目的

很簡單的一句話,可以利用反射機制重新獲取到Object對象,這個是動態加載類以及對象的,是在程序運行時纔會發生的動作,至於反射機制的具體應用,先挖個坑,以後填

API文檔的仿製

按照Class類的特性,java種的一切都是Class類的對象,我們可以獲取到這些“對象”的信息,比如任意類的屬性、構造方法、所有方法等等信息,誠然,我們甚至可以做出一個API文檔

public static void main(String[] args) throws ClassNotFoundException{
        // 1.返回與帶有給定字符串名的類或接口相關聯的 Class 對象,直接導致該類被初始化
        Class testClass = Class.forName("java.lang.Class");

        // 2. 獲取該類的實例化對象
        Class testClass2 =  Class.class;

        // 3.獲取該類的實例化Class對象
        Class testClass3 = new Test().getClass();

        String target = "([a-zA-Z_-]+)\\."; // 需要匹配的正則表達式,表示了形如“字母+.”的模式,這樣便去除了某個類的包名前綴

        Class<? super Object> superC = testClass.getSuperclass();
        String name = superC.getName();
        System.out.print("Class的父類是:" + name.replaceAll(target, "") + "\n");

        Constructor<Class>[] consClass = testClass.getDeclaredConstructors();
        System.out.println("Class的構造方法有:");
        for(Constructor con : consClass){
            name = con.toString();
            name = name.replaceAll(target, "");
            System.out.println(name);
        }

        Class<Class>[] classes = testClass.getClasses();
        System.out.println("Clsass所有的成員的公共類和接口:");
        if(classes.length==0)
            System.out.println("null");
        for(Class cla : classes){
            name = cla.toString();
            name = name.replaceAll(target, "");
            System.out.println(name);
        }

        System.out.println("Class的屬性是:");
        Field[] fields = testClass.getDeclaredFields();
        for(Field f : fields){
            name = f.toString();
            name = name.replaceAll(target, "");
            System.out.println(name);
        }

        Method[] methods = testClass.getMethods();
        System.out.println("Class的所有方法是:");
        for(int i=0; i<methods.length; i++){
            name = methods[i].toString();
            name = name.replaceAll(target, "");
            System.out.println(name);
        }

        ClassLoader loader = testClass.getClassLoader();// 如果對象是基本類型或者是void,則返回null
        System.out.println("Class的類加載器是:" + loader);

這只是一個簡單的思路介紹,重要的是從0到1的過程,至於怎麼從1到n,這需要更多的努力。

發佈了51 篇原創文章 · 獲贊 89 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章