随笔-31  评论-257  文章-0  trackbacks-0
      在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 姜大叔 阅读(272) 评论(1)  编辑  收藏 所属分类: Java

评论:
# re: Java反射机制 2009-04-07 16:17 | guooo
写的不错  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: