Java 编程的动态性,第 2部分: 引入反射
2010-03-18 00:00:00 来源:WEB开发网从任意位置到类公共组件的接入
类自身外部无任何到私有组件的接入
受保护和打包(缺省接入)组件的有限接入
不过-至少某些时候,围绕这些限制有一种简单的方法。我在前面实例中使用的 Constructor 、 Field 和 Method 类都扩展了一个普通的基本类-- java.lang.reflect.AccessibleObject 类。该类定义一种 setAccessible 方法,使您能够启动或关闭对这些类中其中一个类的实例的接入检测。唯一的问题在于如果使用了安全性管理器,它将检测正在关闭接入检测的代码是否许可了这样做。如果未许可,安全性管理器抛出一个例外。
清单6展示了一个程序,在 清单 1 TwoString 类的一个实例上使用反射来显示安全性正在运行:
清单 6:反射安全性正在运行
public class ReflectSecurity {
public static void main(String[] args) {
try {
TwoString ts = new TwoString("a", "b");
Field field = clas.getDeclaredField("m_s1");
// field.setAccessible(true);
System.out.println("Retrieved value is " +
field.get(inst));
} catch (Exception ex) {
ex.printStackTrace(System.out);
}
}
}
如果您编译了这一程序,不使用任何特定参数直接从命令行运行,它将在 field.get(inst) 调用中抛出一个 IllegalAccessException 。如果您未注释 field.setAccessible(true) 代码行,那么重新编译并重新运行该代码,它将取得成功。最后,如果您在命令行添加了JVM参数 -Djava.security.manager 以实现安全性管理器,它将再次失败,除非您定义了 ReflectSecurity 类的许可权限。
更多精彩
赞助商链接