樂字節Java反射之三:方法、數組、類加載器和類的生命週期

本文承接上一篇:樂字節Java發射之二:實例化對象、接口與父類、修飾符和屬性

繼續講述Java反射之三:方法、數組、類加載器

一、方法

獲取所有方法(包括父類或接口),使用Method即可。
圖片描述

 public static void test() throws Exception {
        Class<?> clz = Class.forName("com.shsxt.ref.simple.User ");
        //獲取屬性
System.out.println("===============本類方法===============");
        // 取得全部公共方法
        Method[] methods =clz.getMethods();
        for(Method m:methods){
            //1、權限 
            int mod=m.getModifiers();
            System.out.print(Modifier.toString(mod)+" ");
            //2、返回類型
            Class<?> returnType=m.getReturnType();
            System.out.print(returnType.getName()+" ");
            //3、名字
            String name =m.getName();
            System.out.print(name +"(");
            //4、參數
            Class<?>[] para=m.getParameterTypes();
            for(int i=0;i<para.length;i++){                
                Class<?> p =para[i];
                System.out.print(p.getName() +" arg"+i);
                if(i!=para.length-1){
                    System.out.print(",");
                }
            }
            //異常
            Class<?>[] exce=m.getExceptionTypes();
            if(exce.length>0){
                System.out.print(") throws ");
                for(int k=0;k<exce.length;++k){
                    System.out.print(exce[k].getName()+" ");
                    if(k<exce.length-1){
                        System.out.print(",");
                    }
                }
            }else{
                System.out.print(")");
            }
            System.out.println();
        }         
    }

二、 數組

操作數組需要藉助Array類。

//1、創建數組
        Object obj =Array.newInstance(int.class, 5);
        //2、獲取大小
        if(obj.getClass().isArray()){  //3、判斷是否爲數組
            System.out.println(Array.getLength(obj));
            //4、設置值
            Array.set(obj,0, 100);
            //5、獲取值
            System.out.println(Array.get(obj,0));
        }

三、 類加載器

在java中有三種類類加載器:

⑴Bootstrap ClassLoader 此加載器採用c++編寫,一般開發中很少見。

⑵Extension ClassLoader 用來進行擴展類的加載,一般對應的是jrelibext目錄中的類

⑶AppClassLoader 加載classpath指定的類,是最常用的加載器。同時也是java中默認的加載器。 瞭解即可。

public static void main(String[] args) throws Exception {
         System.out.println("類加載器  "+ClassLoader.class.getClassLoader().getClass().getName());
    }

圖片描述

四、類的生命週期

在一個類編譯完成之後,下一步就需要開始使用類,如果要使用一個類,肯定離不開JVM。在程序執行中JVM通過裝載,鏈接,初始化這3個步驟完成。

類的裝載是通過類加載器完成的,加載器將.class文件的二進制文件裝入JVM的方法區,並且在堆區創建描述這個類的java.lang.Class對象。用來封裝數據。 但是同一個類只會被類裝載器裝載一次。

鏈接就是把二進制數據組裝爲可以運行的狀態。鏈接分爲校驗,準備,解析這3個階段

1、校驗一般用來確認此二進制文件是否適合當前的JVM(版本),

2、準備就是爲靜態成員分配內存空間。並設置默認值

3、解析指的是轉換常量池中的代碼作爲直接引用的過程,直到所有的符號引用都可以被運行程序使用(建立完整的對應關係)

完成之後,類型也就完成了初始化,初始化之後類的對象就可以正常使用了,直到一個對象不再使用之後,將被垃圾回收。釋放空間。當沒有任何引用指向Class對象時就會被卸載,結束類的生命週期。

樂字節原創,歡迎繼續關注 樂字節

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