歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中利用反射對類的hidden成員方法和屬性的訪問

java中通過訪問控制符來控制對類成員的訪問,private 成員表示只在類的內部才可以被訪問,但是利用java的反射機制卻可以再類的外部來訪問類的私有成員

下面是個簡單的例子來說明這一點

 

  1. package com.eric.reflect;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Method;  
  5.   
  6. /** 
  7.  *  
  8.  * this class mainly for explain how to access hidden method or field 
  9.  *  
  10.  *  
  11.  *  
  12.  * archive $ProjectName: $ 
  13.  *  
  14.  * @author Admin 
  15.  *  
  16.  * @version $Revision: $ $Name: $ 
  17.  */  
  18. public class AccesHiddenElements {  
  19.     public static void main(String[] args) {  
  20.         Inter inter = new InterImpl();  
  21.         inter.f();  
  22.         if (inter instanceof InterImpl) {  
  23.             // use class cast to method that in InterImpl class   
  24.             ((InterImpl) inter).g();  
  25.             // can't access h method   
  26.             // ((InterImpl) inter).h();   
  27.         }  
  28.         // (1)javap -private InterImpl to get all method name eg h()   
  29.         // (2)use reflect to access private method   
  30.         accessMehodByName(inter, "h");  
  31.         accessFieldByName(inter, "name");  
  32.         Inter annousInter = new Inter() {  
  33.             public void f() {  
  34.                 System.out.println("f() method in annousInter");  
  35.             }  
  36.   
  37.             private void g() {  
  38.                 System.out.println("g() method in annousInter");  
  39.             }  
  40.   
  41.         };  
  42.         accessMehodByName(annousInter, "g");  
  43.     }  
  44.   
  45.     static void accessMehodByName(Object obj, String methodName) {  
  46.         try {  
  47.             Method method = obj.getClass().getDeclaredMethod(methodName);  
  48.             method.setAccessible(true);  
  49.             method.invoke(obj);  
  50.         } catch (Exception e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54.   
  55.     static void accessFieldByName(Object obj, String methodName) {  
  56.         try {  
  57.             Field field = obj.getClass().getDeclaredField(methodName);  
  58.             field.setAccessible(true);  
  59.             System.out.println(field.getInt(obj));  
  60.         } catch (Exception e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.     }  
  64.   
  65. }  
  66.   
  67. interface Inter {  
  68.     public void f();  
  69. }  
  70.   
  71. class InterImpl implements Inter {  
  72.        <pre name="code" class="java">       //私有屬性,正常情況下外部類不可以訪問此方法  

private int name = 10;public void f() {System.out.println("f() in InterImpl");}public void g() {System.out.println("g() in InterImpl");} //私有方法,正常情況下外部類不可以訪問此方法private void h() {System.out.println("h() in InterImpl");}}/* * * History: * * * * $Log: $ */

Copyright © Linux教程網 All Rights Reserved