screenswindow 2012-02-08
1. 什么是Java反射机制
Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。
用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构。
2. 为什么要有Java反射机制
我们为什么要用Java的反射机制呢?
我认为有两种:
第一种:反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。
第二种:在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象。
一个生活中常看到的例子有助于理解我们为什么要用Java的反射机制:你进了一家饭店,你不知道他们都有那些菜,要多少钱。那么你第一件事情是干啥“服务员拿个菜单过来”,然后指着菜单说“我要这个,我要那个”。
3. 一起来看ReflectionAPI
在生活中,我们使用一个未知的东西的时候总会用帮助来解决我们的使用问题,电视机有帮助,电脑有帮助,几乎所有的事物都携带着它的一本帮助,Java的反射机制也不例外。
在JDK中有Reflection API的帮助,它主要说明了什么是Java反射机制,这种反射机制提供了什么样的属性和方法,进一步我们能够知道能够通过它完成什么样的工作。
下面咱就一起看看这部分的API。这些接口和类都位于lang包里。
如图:
接口:
类:
简单介绍一些类和接口的用法:
1) Member成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息
2) InvocationHandler是代理实例的调用处理程序 实现的接口(这个接口的具体用法等到java反射机制剖析4着重介绍)
3) Method提供一个类的方法的信息以及访问类的方法的接口。
示例:
import java.lang.reflect.Method; public class TestMethod { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Class classType=Class.forName(args[0]); Method methods[]=classType.getDeclaredMethods(); for(int i=0;i<methods.length;i++){ System.out.println(methods[i].toString()); } } }
4) Filed提供一个类的域的信息以及访问类的域的接口。
示例:
import java.lang.reflect.Field; public class TestField { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Class classType=Class.forName(args[0]); Field[] fields = classType.getFields(); for(int i=0;i<fields.length;i++){ System.out.println(fields[i].toString()); } } }
5) Array 类提供了动态创建和访问 Java 数组的方法。
示例:
import java.lang.reflect.Array; public class TestArray { public TestArray(){ } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Class<?> classType = Class.forName("java.lang.String"); Object array = Array.newInstance(classType, 10); Array.set(array, 5, "hello"); String s = (String)Array.get(array, 5); System.out.println(s); } }
6) Proxy提供动态地生成代理类和类实例的静态方法(这个方法在java放射机制剖析4着重介绍)。