本文摘自《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:红色