在Java中使用反射分析类结构

转载 2004年07月16日 10:16:00

基本编程思路:

      首先要获取需要进行分析的类的名称,将类名称指定到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学习之类加载全过程_JVM内存分析_反射机制核心原理_常量池理解

一、类加载机制 JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最形成JVM可以直接使用的JAVA类型的过程。加载-->链接(-->验证-->准备-->解析)-->初始化-->使用...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月14日 23:14
  • 2210

java反射与xml文件解析

在项目开发的过程中,遇到了要将日志导出为xml格式和将xml导入到日志数据库中的功能需求,因为项目中存在多种日志形式(这听起来很奇葩是不是?),我实在懒得为每一种日志都写一个方法。想到在开始的设计过程...
  • fightingform
  • fightingform
  • 2014年07月15日 13:18
  • 2302

java 反射api的功能详解

前言     本文是我整理的Java反射的一些知识,其中大部分内容是翻译http://tutorials.jenkov.com/java-reflection/index.html的。 1. ...
  • qilixiang012
  • qilixiang012
  • 2014年07月24日 14:41
  • 3254

JAVA reflect (反射) 分析类结构

一、数据准备Java反射用到的Human类package ReflectAnalysis;public class Human { public String name; privat...
  • tterminator
  • tterminator
  • 2016年04月26日 13:25
  • 630

java反射(2)--通过Class类去的完整结构

可以通过Class中各种方法去的类的完整
  • sh542610
  • sh542610
  • 2014年04月30日 11:08
  • 394

JAVA反射机制 检查类的结构

package com.itheima.reflect; import java.lang.reflect.*; public class ReflectionTest { public stat...
  • u014783877
  • u014783877
  • 2014年09月15日 14:11
  • 141

java反射----取得类结构

定义一个接口 package cn.yangtao.reflect; public interface China {  public static final String NATIONAL=...
  • chen5287603
  • chen5287603
  • 2011年05月14日 22:38
  • 244

16---java反射机制03(取得类结构)

在实际开发中用到反射机制提供的功能很多,远不止只是得到类的名称和方法, 还可以得到类的完整结构,那么就要用到java.lang.reflect包下的这几个类了: Constructor:表示类中的...
  • bzuld
  • bzuld
  • 2012年03月02日 09:30
  • 225

用JAVA反射获得任意类的内部结构

package chapter12.PairTest3; import java.lang.reflect.Method; import java.lang.reflect.Modifier; im...
  • xiongchao2011
  • xiongchao2011
  • 2012年05月23日 17:37
  • 1074

java反射机制功能之---检查类的结构

java反射机制的功能极其强大,可以用来在运行中分析类的能力、在运行中查看对象、实现通用的数组操作代码、利用Method对象等。在这里主要说下反射机制最重要的内容-检查类的结构(利用反射分析类的能力)...
  • mg2flyingff
  • mg2flyingff
  • 2015年08月22日 19:55
  • 406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Java中使用反射分析类结构
举报原因:
原因补充:

(最多只允许输入30个字)