久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 aaie_ 2017-01-23

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

1.準(zhǔn)備一個(gè)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:這是一個(gè)public訪問權(quán)限方法");  
  7.     }  
  8.       
  9.     private void fun2(){  
  10.         System.out.println("fun2:這是一個(gè)private訪問權(quán)限方法");  
  11.     }  
  12.       
  13.     private void fun3(String arg){  
  14.         System.out.println("fun3:這是一個(gè)private訪問權(quán)限且?guī)?shù)的方法,參數(shù)為:"+arg);  
  15.     }  
  16.       
  17. }  

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

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

第一步做好后,接下來(lái)進(jìn)行第二步:獲取類中屬性及方法的信息,。對(duì)于一個(gè)class文件,無(wú)法查看源碼,,如何獲取類中屬性及方法的信息呢?很自然地,,我們會(huì)想到利用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實(shí)例  
  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. }  

運(yùn)行結(jié)果如下:

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

1.聲明為private的屬性或方法無(wú)法通過(guò)這種途徑來(lái)獲取,。

2.結(jié)果中多出來(lái)的方法為從Object類中繼承來(lái)的方法。

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

java -private Exam                                                                ; -private 標(biāo)志表示所有的成員都應(yīng)該顯示,,甚至包括私有成員

運(yùn)行結(jié)果如下:


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


3.調(diào)用Method及Field類中的相關(guān)方法獲取private聲明的屬性及方法

也許你還在為第二步中如此辛苦地得到類中的信息相當(dāng)不解,,其實(shí)這是在為這一步作鋪墊。請(qǐng)看以下代碼: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,"重新設(shè)置一個(gè)field1值");  
  14.             System.out.println("field1: "+field1.get(e));  
  15.             System.out.println("field2: "+field2.get(e));  
  16.             field2.set(e,"重新設(shè)置一個(gè)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的參數(shù)");  
  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. }  

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

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

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

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

Test02.java運(yùn)行結(jié)果如下:

由運(yùn)行結(jié)果可知,,利用反射不但可以訪問類的私有屬性,、方法,還可以重新設(shè)置私有屬性的值,,調(diào)用私有方法,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多