网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  在java中使用反射分析类结构     
  文章作者:未知  文章来源:水木森林  
  查看:89次  录入:管理员--2007-11-17  
 
  首先要获取需要进行分析的类的名称,将类名称指定到class类中的forname(string classname)方法为参数,调用该方法后将返回一个该指定类型的class对象,class对象描述了该类型的详细信息,其中一些重要的方法包括:getfields(),getmethods(),getconstructors()这些方法分别返回该类型中支持的公有字段,方法和构造器数组,其中包含超类的公有成员,而同是class中以上的方法名称中加入了“declared”的方法则返回该类型中定义的所有成员包括私有的但不包括超类成员,现在,我们已经获得了该类型的字段,方法和构造器数组,接着,我们使用java.lang.reflect包中的field,method,constructor类来获得字段,方法和构造器的详细信息,例如:我们要显示该类型中的所有的字段信息,伪代码:
  
  //getdeclaredfields返回所有定义的字段数组
  
  field[] fields = class.getdeclaredfields(); 
  
  for (i = 0; i < fields.length; i++)
  
  {
  
        field f = fields[i];
  
        class type = f.gettype();  //gettype()返回字段的数据类型
  
        string name = f.getname();  //getname()返回字段名称
  
        println(modifier.tostring(f.getmodifiers()));
  
        //getmodifiers()返回一个代表访问控制符的整数
  
        //modifier.tostring()将该整数转换为对应的访问控制符字符串
  
        println(" "+ type.getname() + " "+ name);
  
        //type.getname()返回数据类型名称
  
  }
  
  好了下面看一个完整的例子,例子长了一点不过很简单!
  
  import java.lang.reflect.*;
  import javax.swing.*;
  
  public class reflecttest
  {
    public static void main(string[] args)
    {
      string name;
      if (args.length > 0)
        name = args[0];
      else
        name = joptionpane.showinputdialog("输入一个类名:按(java.lang.double)格式");
      
      try
      {
        class cl = class.forname(name);
        class supercl = cl.getsuperclass(); //获得超类的class对象
        system.out.println("class "+ name);
        //判断超类是否为空或为object
        if (supercl != null && supercl != object.class)
          system.out.println("extends "+ supercl.getname());
        
        system.out.print("/n{/n");
        printconstructors(cl);
        system.out.println();
        printmethods(cl);
        system.out.println();
        printfield(cl);
        system.out.println("}");
      }
      //当使用class对象时注意捕获该异常,异常为类型未创建
      catch(classnotfoundexception e)
      {
        e.printstacktrace();
        system.out.println("类型未创建");
      }
      system.exit(0);
    }
    
    /**
     *该方法打印构造器的详细信息
     */
    public static void printconstructors(class cl)
    {
      //定义构造器数组
      constructor[] constructors = cl.getdeclaredconstructors();
      
      for (int i = 0; i < constructors.length; i++)
      {
        //将数组元素赋给一个构造器对象
        constructor constr = constructors[i];
        string name = constr.getname(); //获取构造器名称
        //打印访问修饰符
        system.out.print(modifier.tostring(constr.getmodifiers()));
        system.out.print(" "+ name + "(");
        
        /**
         *定义一个参数类型数组该数组是class对象
         *getparametertypes()返回该构造器参数类型的数组
         *打印参数类型名称
         */
        class[] paramtypes = constr.getparametertypes();
        for (int j = 0; j < paramtypes.length; j++)
        {
          if (j > 0) system.out.print(", ");
          system.out.print(paramtypes[j].getname());
        }
        system.out.println(");");
      }
    }
    
    /**
     *该方法打印方法的详细信息
     */
    public static void printmethods(class cl)
    {
      method[] methods = cl.getdeclaredmethods();
      
      for (int i = 0; i < methods.length; i++)
      {
        method m = methods[i];
        class rettype = m.getreturntype();
        string name = m.getname();
        
        system.out.print(modifier.tostring(m.getmodifiers()));
        system.out.print(" "+ rettype.getname() +" "+ name + "(");
        
        class[] paramtypes = m.getparametertypes();
        for (int j = 0; j < paramtypes.length; j++)
        {
          if (j > 0) system.out.print(", ");
          system.out.print(paramtypes[j].getname());
        }
        system.out.println(");");
      }
    }
    
    /**
     *该方法打印字段的详细信息
     */
    public static void printfield(class cl)
    {
      field[] fields = cl.getdeclaredfields();
      
      for (int i = 0; i < fields.length; i++)
      {
        field f =fields[i];
        class type = f.gettype();
        string name = f.getname();
        system.out.print(modifier.tostring(f.getmodifiers()));
        system.out.println(" "+ type.getname() +" "+ name + ";");
      }
    }
  }
  
  我经常遇到这样的问题:比如当我要写一个接受命令行参数的程序时我通常是先打开netbeans工具,写完并保存后有回到命令提示符上使用javac编译java运行,为什么?因为用开发环境运行的话接收不了命令行参数而会抛出一个异常,我是不是很蠢,其实用一个joptionpane.showinputdialog可以避免发生这样的事情,只需加一个判断,我们编程的良好风格是多关心如何编写稳重的代码,而不是动不动就捕捉异常!
 
 
上一篇: 通过 java 如何实现 aes 密码算法    下一篇: 简单的 java 循环控制实现行列式算法
  相关文档
java语言深入:关于java数组的深度思考 02-25
今天学习到的java中的几个知识点 11-17
toprecision 方法 11-16
fileexists 方法 11-16
一个java编程老手的设计语录 11-17
java语言和c++语言的差异—老生常谈 11-17
自动更新表格控件JTable中的数据 08-07
aop benchmark 11-17
intellij idea 版本5以及6的用户配置 11-17
java初学者如何迈出aop第一步--使用java 动态代理实现aop 11-17
java编程中怎样实现中文排序 11-17
用ant和eclipse有效地提高部署效率 11-17
java实现屏幕取色 11-16
java gui:在java中监控文本框的变化 01-14
为什么程序员不应调用“sun”包? 11-17
j2se综合--谈论泛型方法及动态的参数 12-24
java基础:java语言灵巧指针与垃圾回收 11-16
flex与servlet通讯(上)。 11-17
用eclipseme0.5.5创建简单的j2me程序(图) 11-17
java辨析(1):==和equal.doc 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息