WEB开发网
开发学院软件开发Java Java 编程的动态性,第 2部分: 引入反射 阅读

Java 编程的动态性,第 2部分: 引入反射

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 从任意位置到类公共组件的接入类自身外部无任何到私有组件的接入受保护和打包(缺省接入)组件的有限接入不过-至少某些时候,围绕这些限制有一种简单的方法,Java 编程的动态性,第 2部分: 引入反射(7),我在前面实例中使用的 Constructor 、 Field 和 Method 类都扩展了一个

从任意位置到类公共组件的接入

类自身外部无任何到私有组件的接入

受保护和打包(缺省接入)组件的有限接入

不过-至少某些时候,围绕这些限制有一种简单的方法。我在前面实例中使用的 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 类的许可权限。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:Java 编程 动态性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接