久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    java利用反射訪問類的私有(private)屬性及方法

     aaie_ 2017-01-23

    java語言中,在一個類中,為了不讓外界訪問到有的屬性和方法,通常將其設置為private,用正常的方式(對象名.屬性名,對象名.方法名)將無法訪問此屬性與方法,但有沒有其他方法可以訪問呢?答案是有的,這就是java反射帶來的便利。利用反射訪問類的私有屬性及方法如下:

    1.準備一個java類,包含私有屬性及方法:

    1. //Exam.java  
    2. public class Exam{  
    3.     private String field1="私有屬性";  
    4.     public String field2="公有屬性";  
    5.     public void fun1(){  
    6.         System.out.println("fun1:這是一個public訪問權限方法");  
    7.     }  
    8.       
    9.     private void fun2(){  
    10.         System.out.println("fun2:這是一個private訪問權限方法");  
    11.     }  
    12.       
    13.     private void fun3(String arg){  
    14.         System.out.println("fun3:這是一個private訪問權限且帶參數的方法,參數為:"+arg);  
    15.     }  
    16.       
    17. }  

    將其編譯成class,然后刪除java源文件。注意:刪除java源文件并非必須,但是在實際情況中,我會使用的往往不是java源文件,而是jar包,而jar包中的文件都是class,所以為了貼近實際的情況,將Exam.java編譯成Exam.class文件后,刪除Exam.java文件,只保留Exam.class文件。

    2.獲取類中屬性及方法的信息

    第一步做好后,接下來進行第二步:獲取類中屬性及方法的信息。對于一個class文件,無法查看源碼,如何獲取類中屬性及方法的信息呢?很自然地,我們會想到利用java反射功能,得到類的屬性、方法:

    1. //Test01.java  
    2. import java.lang.reflect.Field;  
    3. import java.lang.reflect.InvocationTargetException;  
    4. import java.lang.reflect.Method;  
    5.   
    6. public class Test01 {  
    7.     public static void main(String args[]){  
    8.         Exam e=new Exam();  //初始化Exam實例  
    9.         System.out.println("獲取類中所有的屬性:");  
    10.         Field field[] = e.getClass().getFields();   
    11.         for(Field f : field){  
    12.             System.out.println(f);  
    13.         }  
    14.         System.out.println("獲取類中所有的方法:");  
    15.         Method[] method = e.getClass().getMethods();  
    16.         for(Method m : method){  
    17.             System.out.println(m);  
    18.         }  
    19.           
    20.     }  
    21. }  

    運行結果如下:

    從運行結果可以看到,獲取的屬性中只有field2,而獲取的方法中似乎多了好多類中沒有的,但最主要的是,無論是屬性還是方法,都是public聲明的,沒有得到private聲明的屬性或方法。由此可以推斷:

    1.聲明為private的屬性或方法無法通過這種途徑來獲取。

    2.結果中多出來的方法為從Object類中繼承來的方法。

    那么,是不是就沒有辦法了呢?不是的!我們可以使用jdk中的javap命令來突破這個問題:

    java -private Exam                                                                ; -private 標志表示所有的成員都應該顯示,甚至包括私有成員

    運行結果如下:


    此時,可以看到類中所有的屬性、方法都有了。


    3.調用Method及Field類中的相關方法獲取private聲明的屬性及方法

    也許你還在為第二步中如此辛苦地得到類中的信息相當不解,其實這是在為這一步作鋪墊。請看以下代碼:Testo2.java

    1. import java.lang.reflect.Field;  
    2. import java.lang.reflect.InvocationTargetException;  
    3. import java.lang.reflect.Method;  
    4.   
    5. public class Test02 {  
    6.     public static void main(String args[]){  
    7.         Exam e=new Exam();  
    8.         try {  
    9.             field1 = e.getClass().getDeclaredField("field1");  
    10.             field2 = e.getClass().getDeclaredField("field2");  
    11.             field1.setAccessible(true);  
    12.             System.out.println("field1: "+field1.get(e));  
    13.             field1.set(e,"重新設置一個field1值");  
    14.             System.out.println("field1: "+field1.get(e));  
    15.             System.out.println("field2: "+field2.get(e));  
    16.             field2.set(e,"重新設置一個field2值");  
    17.             System.out.println("field2: "+field2.get(e));  
    18.         } catch (NoSuchFieldException e1) {  
    19.             e1.printStackTrace();  
    20.         }catch (IllegalArgumentException e1) {  
    21.             e1.printStackTrace();  
    22.         } catch (IllegalAccessException e1) {  
    23.             e1.printStackTrace();  
    24.         }  
    25.           
    26.         try {  
    27.               
    28.             Method method1 = e.getClass().getDeclaredMethod("fun1");  
    29.             method1.invoke(e);  
    30.               
    31.             Method method2 = e.getClass().getDeclaredMethod("fun2");  
    32.             method2.setAccessible(true);  
    33.             method2.invoke(e);  
    34.               
    35.             Method method3 = e.getClass().getDeclaredMethod("fun3",String.class);  
    36.             method3.setAccessible(true);  
    37.             method3.invoke(e,"fun3的參數");  
    38.         } catch (NoSuchMethodException e1) {  
    39.             // TODO Auto-generated catch block  
    40.             e1.printStackTrace();  
    41.         } catch (SecurityException e1) {  
    42.             // TODO Auto-generated catch block  
    43.             e1.printStackTrace();  
    44.         }catch (IllegalAccessException e1) {  
    45.             // TODO Auto-generated catch block  
    46.             e1.printStackTrace();  
    47.         } catch (IllegalArgumentException e1) {  
    48.             // TODO Auto-generated catch block  
    49.             e1.printStackTrace();  
    50.         } catch (InvocationTargetException e1) {  
    51.             // TODO Auto-generated catch block  
    52.             e1.printStackTrace();  
    53.         }  
    54.     }  
    55. }  

    注意以下語句:
    1. field1 = e.getClass().getDeclaredField("field1");  

    getDeclaredField(String fieldName)中,參數fieldName為屬性名,

    1. Method method3 = e.getClass().getDeclaredMethod("fun3",String.class);  

    getDeclaredMethod(String methodName,Class parameterType)中,第一個參數為方法名,第二個參數為方法參數類型,當然在此方法中第二個參數為可孌參數。

    Test02.java運行結果如下:

    由運行結果可知,利用反射不但可以訪問類的私有屬性、方法,還可以重新設置私有屬性的值,調用私有方法。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 成人网站国产在线视频内射视频 | 亚洲日韩欧美一区二区三区| 国产猛男猛女超爽免费视频| 四虎精品视频永久免费| 又色又污又爽又黄的网站| 欧美激情一区二区久久久| 91中文字幕在线一区| A级毛片100部免费看| 中文字幕av无码免费一区| 丁香五月激情综合色婷婷| 亚洲AV中文无码字幕色最新 | 亚洲乱亚洲乱少妇无码| 蜜臀av久久国产午夜| 国产亚洲精品国产福APP| 国产精品亚洲二区亚瑟| 18禁美女裸体爆乳无遮挡| 亚洲精品一区二区区别| 亚洲高清乱码午夜电影网| 国产不卡在线一区二区| 亚洲精品无码久久久久去Q| 亚洲欧洲一区二区精品| 国产AV人人夜夜澡人人爽| 男女动态无遮挡动态图| 精品国产乱码久久久久久郑州公司| 亚洲精品无码成人A片九色播放| 精品亚洲麻豆1区2区3区| 2019国产精品青青草原| 国产普通话对白刺激| 东京热TOKYO综合久久精品| 少妇无套内射中出视频| 成人H动漫精品一区二区无码| 丰满人妻被黑人连续中出| 亚洲综合在线日韩av| 国产乱子影视频上线免费观看| 国产网友愉拍精品视频手机| 国产一区二区三区不卡AV| 东北女人毛多水多牲交视频 | 亚洲综合色成在线观看| 国产精品中文第一字幕| 日本理伦片午夜理伦片| 国产精品久久久久影院亚瑟|