JAVA反射机制的小记

本文摘自《Spring 3.x 企业应用开发实战》

Java还为包提供了Package反射类,在JDK 5.0中还为注解提供了AnnotatedElement反射类。总之,Java的反射体系保证了可以通过程序化的方式访问目标类中所有的元素,对于private或protected的成员变量和方法,只要JVM的安全机制允许,也可以通过反射进行调用。例子如下。

package com.baobaotao.reflect;
public class PrivateCar {
       //①private成员变量:使用传统的类实例调用方式,只能在本类中访问
   private String color; 
        //②protected方法:使用传统的类实例调用方式,只能在子类和本包中访问
   protected void drive(){
	   
System.out.println("drive private car! the color is:"+color);
   }
}
public class PrivateCarReflect {
   public static void main(String[] args) throws Throwable{
	   ClassLoader loader = Thread.currentThread().getContextClassLoader();
	   Class clazz = loader.loadClass("com.baobaotao.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",(Class[])null);
        //Method driveMtd = clazz.getDeclaredMethod("drive"); JDK5.0下使用
       
        //②取消Java语言访问检查以访问protected方法
	   driveMtd.setAccessible(true); 
        driveMtd.invoke(pcar,(Object[])null);
  }
}

运行该类,打印出以下信息:

drive private car! the color is:红色

原文地址:https://www.cnblogs.com/shuoli/p/7306729.html