在java中,如果類里面的變量是聲明了private的,那么只能在被類中訪問,外界不能調用,如果是protected類型的,只能在子類或本包中調用,俗話說沒有不透風的牆。但是可以利用java中的反射從而在外界調用private、protected的變量或方法
package reflect; public class PrivateCar { //private成員變量:在傳統的類實例調用方式,只能在本類中訪問 private String color; //protected方法:使用傳統的類實例調用方式,只能在子類和本包中訪問 protected void drive(){ System.out.println("this is private car! the color is:"+color); } }
這里定義了一個類,有一個private的變量color
還有一個protected的方法drive();
package reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; public class PrivateCarReflect { public static void main(String[] args) throws Throwable{ ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class clazz = loader.loadClass("reflect.PrivateCar"); PrivateCar pcar = (PrivateCar) clazz.newInstance(); Field colorFld = clazz.getDeclaredField("color"); //取消java語言訪問檢查以訪問private變量 colorFld.setAccessible(true); colorFld.set(pcar, "紅色"); Method driveMtd = clazz.getDeclaredMethod("drive"); //取消java語言訪問檢查以訪問protected方法 driveMtd.setAccessible(true); driveMtd.invoke(pcar, (Object[])null); } }
在訪問private、protected成員變量或方法是必須通過
setAccessible(true); 方法取消java語言檢查,否則將拋出IllegalAccessException.