利用反射分析类的能力(java核心技术卷I)

java.lang.reflect包中有三个类Field、Method、Constructor用于描述类的域、方法、构造器。三个类中都有一个方法为getName(),返回项目的名称,其他常用方法会在代码中有描述;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Date;
import java.util.Scanner;

public class mode4 {
    public static void main(String[] args) {
        String name;
        //输入class.name
        if(args.length>0){
            name = args[0];
        }else
        {
            Scanner scanner = new Scanner(System.in);
            name = scanner.nextLine();
        }

        try {
            Class c1 = Class.forName(name);
            //得到父类
            Class supercl = c1.getSuperclass();
            //得到该类的修饰符(getMmodifiers()是返回整数值,代表各种修饰符的开关,也可以用        
            //isPublic等方法判断)
            String modifiers = Modifier.toString(c1.getModifiers());
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            System.out.print("class "+name+" ");
            //打印继承的父类
            if(supercl!=null&&supercl!=Object.class){
                System.out.print("extends "+supercl.getName());
            }
            //主体
            System.out.print("\n{\n");
            //打印构造器
            printConstructors(c1);
            System.out.println();
            //打印域
            printField(c1);
            System.out.println();
            //打印方法
            printMethod(c1);

            System.out.print("\n}");
        }
        catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    public static void printConstructors(Class c1){
        //getConstructors()返回一个Constructors对象的数组,包含该类中的所以构造器
        Constructor[] constructors = c1.getConstructors();

        for (int i = 0; i < constructors.length; i++) {
            System.out.print("	");
            String name = c1.getName();
            //打印该构造器的修饰符
            String modifiers = Modifier.toString(c1.getModifiers());
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            //打印该构造器的参数,这里为了方便写了一个方法专门打印参数
            System.out.print(c1.getName()+"(");
            reClass(constructors[i].getParameterTypes(), constructors, i);
        }
    }

    public static void printField(Class c1){
        Field[] fields = c1.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            System.out.print("\t");
            String modifiers = Modifier.toString(c1.getModifiers());
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            String name = fields[i].getName();
            System.out.print(" ");
            if(fields[i].getType()!=null) {
                //打印该域的Type
                System.out.print(fields[i].getType() + " " + name+"\n");
            }else
            {
                System.out.print(name+"\n");
            }
        }
    }

    public static void printMethod(Class c1){
        Method[] methods = c1.getDeclaredMethods();

        for (int i = 0; i < methods.length; i++) {
            System.out.print("\t");
            String name = methods[i].getName();
            String modifiers = Modifier.toString(methods[i].getModifiers());
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            Class retype = methods[i].getReturnType();
            if(retype!=null){
                System.out.print(retype.getName()+" "+name);
            }
            System.out.print("(");
            reClass(methods[i].getParameterTypes(), methods, i);
        }
    }

    private static void reClass(Class[] parameterTypes, Constructor[] constructors, int i) {
        PrintArray(parameterTypes);
    }

    private static void reClass(Class[] parameterTypes,Method[] methods, int i) {
        PrintArray(parameterTypes);
    }

    private static void PrintArray(Class[] parameterTypes) {
        Class[] classes = parameterTypes;
        for (int i1 = 0; i1 < classes.length; i1++) {
            if(i1>0) System.out.print(", ");
            System.out.print(classes[i1].getName());
        }
        System.out.print(")\n");
    }

}

 

注意:该篇文章是本人为方便学习而写(懒得在其他地方做笔记),不对的地方欢迎各位指出。 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值