知识大全 在Java中使用反射分析类结构

Posted

篇首语:天下难事、必作于易;天下大事、必作于细。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Java中使用反射分析类结构相关的知识,希望对你有一定的参考价值。

在Java中使用反射分析类结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  首先要获取需要进行分析的类的名称 将类名称指定到Class类中的forName(String classname)方法为参数 调用该方法后将返回一个该指定类型的Class对象 Class对象描述了该类型的详细信息 其中一些重要的方法包括 getFields() getMethods() getConstructors()这些方法分别返回该类型中支持的公有字段 方法和构造器数组 其中包含超类的公有成员 而同是Class中以上的方法名称中加入了 Declared 的方法则返回该类型中定义的所有成员包括私有的但不包括超类成员 现在 我们已经获得了该类型的字段 方法和构造器数组 接着 我们使用java lang reflect包中的Field Method Constructor类来获得字段 方法和构造器的详细信息 例如 我们要显示该类型中的所有的字段信息 伪代码     //getDeclaredFields返回所有定义的字段数组    Field[] fields = Class getDeclaredFields();      for (i = ; 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 > )        name = args[ ];      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( );            /**     *该方法打印构造器的详细信息     */    public static void printConstructors(Class cl)          //定义构造器数组      Constructor[] constructors = cl getDeclaredConstructors();            for (int i = ; 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 = ; j < paramTypes length; j++)                  if (j > ) 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 = ; 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 = ; j < paramTypes length; j++)                  if (j > ) 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 = ; 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可以避免发生这样的事情 只需加一个判断 我们编程的良好风格是多关心如何编写稳重的代码 而不是动不动就捕捉异常! cha138/Article/program/Java/JSP/201311/19672

相关参考

知识大全 实用的Java反射工具类

实用的Java反射工具类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  反射的Utils函数集合

知识大全 在JAVA中定义类的结构

在JAVA中定义类的结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  类的基本概念    Ja

知识大全 Java反射机制获取内部类的静态成员

Java反射机制获取内部类的静态成员  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近需要些一

知识大全 Java反射机制的应用例子

Java反射机制的应用例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  目标用一个代理类实现两

知识大全 反射在Java Swing编程中的应用

反射在JavaSwing编程中的应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  学习过Jav

知识大全 Java反射机制中常用API

Java反射机制中常用API  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Class是Refl

知识大全 动态代码的使用(反射和动态生成类)

  在软件开发尤其是框架和底层开发时为了更灵活的控制代码常常需要进行一些动态的操作比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构用户要求动态的生成一些类然后再动态的调用类中的方法当然使用

知识大全 Java HashMap 分析之一:基本结构

JavaHashMap分析之一:基本结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java

知识大全 java的内部类和匿名类剖析

   Java通过对Java语言规范进行修改显著简化了一些实用结构的实现在那些修改中最引人注目的就是内部类和匿名类如运用得当它们可使程序更易理解和维护本文介绍内部类和匿名

知识大全 两种Java容器类List和Set分析

两种Java容器类List和Set分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!容器类可以大大