《Java程序设计:第16章反射》由会员分享,可在线阅读,更多相关《Java程序设计:第16章反射(9页珍藏版)》请在金锄头文库上搜索。
1、第第16章章 反射反射 反射机制可以为程序提供动态的运行能力,这些利用反射可以在运行时对程序进行动态的控制。而在开发中使用反射特性的程序需要一套专门的工具类。本章就主要介绍一下Java的反射机制。16.1 反射概述反射概述 反射是Java提供的比较特殊的特性,可以使用它对程序进行动态控制。开发使用反射的程序所需要的工具类在java.lang.reflect包中。 Class类属于java.lang包,而且该类不需要使用import语句引入特殊的包就可以使用了。它的对象代表着一个类,携带类的相应信息,其中主要包括有构造器、方法和成员变量等。在Java程序的运行过程中,每一个类被加载之后都会在内存
2、中产生一个相对应的Class对象,而这些对象是由系统来自动进行维护。16.1.1 使用使用Class类类 在前面介绍了Class类的常用方法,本小节就通过几个例子来说明Class的使用方法。16.1.2 成员变量成员变量 Java反射用Field类表示成员变量,Field类提供了动态访问成员变量的API。16.1.3 成员方法成员方法 Java反射用Method类表示成员方法,Method类提供了获取成员方法信息和调用成员方法的API。16.1.4 创建实例创建实例 反射中有两种方法创建实例对象:无参数的构造方法和带参数的构造方法。通过无参数的构造函数创建实例比较简单,只要调用Class对象的
3、newInstance()方法即可;而调用带参数的构造方法创建实例就比较复杂,首先通过一个Class早为参数获得包含此参数的构造方法,然后准备一个Object作为参数调用此Constructor对象的newInstance()方法。16.2 应用反射应用反射16.2.1 访问类变量 通过Java的反射机制,可以轻松的获得类变量的所有信息,并且可以修改变量的值。如果这些属性是private或protected的,必须设置setAccessible (true)方法,否则会抛出IllegalAccessException异常,如果启用Java安全机制,则可能会抛出SecurityException异常。16.2.2 调用类方法调用类方法 同样,通过Java反射机制,也可以很轻松的获得方法的相关信息,并且能够调用方法进行运算。私有方法和被保护方法也需要设置setAccessible (true)方法,避免Java安全机制抛出异常。16.3 反射的安全性反射的安全性 通常,除了一个类内的代码,其他程序都不能访问这个类的私有变量和方法,但使用反射却可以绕过这个限制。反射中的Field、Method和Constructor类继承了AccessibleObject类,通过调用这三个类的setAccessible (true)方法,就可以实现对这些属性或方法的调用。