免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

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

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

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

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

第一步做好后,接下來進(jìn)行第二步:獲取類中屬性及方法的信息。對于一個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. }  

運行結(jié)果如下:

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

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

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

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

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

運行結(jié)果如下:


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


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

也許你還在為第二步中如此辛苦地得到類中的信息相當(dā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è)置一個field1值");  
  14.             System.out.println("field1: "+field1.get(e));  
  15.             System.out.println("field2: "+field2.get(e));  
  16.             field2.set(e,"重新設(shè)置一個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. }  

注意以下語句:
  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)中,第一個參數(shù)為方法名,第二個參數(shù)為方法參數(shù)類型,當(dāng)然在此方法中第二個參數(shù)為可孌參數(shù)。

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

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

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java反射設(shè)置私有屬性和獲取屬性
java 利用反射機(jī)制,獲取實體所有屬性和方法,并對屬性賦值
Java反射機(jī)制
List 根據(jù)屬性排序
一個事半功倍的Java反射庫
【第43題】JAVA高級技術(shù)-反射實戰(zhàn)3(動態(tài)設(shè)置類的私有屬性)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服