在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息,以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制。Java反射机制主要提供以下功能:
[*]在运行时判断任意一个对象所属的类;
[*]在运行时构造任意一个类的对象;
[*]在运行时判断任意一个类所具有的成员变量和方法;
[*]在运行时调用任意一个类的方法;
[*]生成动态代理;
在JDK中,主要由以下类来实现Java反射机制,这些类都位于 java.lang.reflect 包中。
[*] Class 类:代表一个类。
[*] Field 类:代表类的成员变量
[*] Method 类:代表类的方法
[*] Constructor 类:代表类的构造方法
[*] Array 类:提供了动态创建数组,以及访问数组元素的静态方法
看看下面例子:它读取命令行参数指定的类名,然后打印这个类的所具有的方法信息:
1 import java.lang.reflect.*;
2 public class DumpMethods{
3 public static void main(String[] args)thorws Exception{
4 //加载并初始化命令行参数指定的类
5 Class classType = Class.forName(args[0]);
6 //获得类的所有方法
7 Method[] methods = classType.getDeclaredMethods();
8 for(int i=0;i<methods.length;i++){
9 System.out.println(methods[i].toString());
10 }
11 }
12 }
运行命令 “java DumpMethods java.util.Stack”,就会显示java.util.Stack 类所具有的方法。
这个只是十分之基本,很简单的示例,Java的反射还可以做很多东西,可以跟据用户的输入就可以得知哪些类,需要做什么操作,就是说动态跟据需要来调用相应的类与相应的方法,我之前也做过,用Struts结合Java反射来实现一些功能,有些时候,别人的接口代码里只返回一个Object给你,而你就要用反射来得知该Object是属于哪一个类型,之后根据设置做相应的操作,不知道大家有用过Hibernate没有,这个框架就是大量用到了Java反射,用户只需配置一下XML文件,Hibernate运行时,就会读取解析XML配置文件,之后动态找相应的类,实例化相应的POJO等等,这些都是全动态化的,也就是说,我请求这个表的数据时,就自动实例化该表的POJO实例,这些都是在XML配置文件里定义好映射关系。ORM框架就如此,很多中间件也是大量使用反射,将反射灵活的运用起来,将会得到意想不到的效果,这也是Java的半动态语言吧。使编程工作变得十分灵活。
posted on 2008-07-29 13:00
姜大叔 阅读(281)
评论(1) 编辑 收藏 所属分类:
Java