java利用反射繞過私有檢查機制實行對private、protected成員變量或方法的訪問


在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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM