反编译

通过写一个反编译类的方法来复习一下反射技术
在这里插入图片描述

import java.lang.reflect.*;

//这是自定义的反编译程序
public class MyReflect {
    //私有构造方法
    private MyReflect(){}
    //定义的方法,需要传递反编译类的全类名
    public static void reflect(String name) {
        try {
            //获取类的Class对象
            Class c = Class.forName(name);
            //开始打印:
            System.out.print(Modifier.toString(c.getModifiers()) +" class " + c.getSimpleName()+" ");
            //判断是否继承有父类(继承的Object将不在打印)
            Class superclass = c.getSuperclass();
            if(!superclass.getSimpleName().equals("Object")){
                System.out.print("extends "+superclass.getSimpleName());
            }
            //判断是否有实现接口
            Class[] interfaces = c.getInterfaces();
            if (interfaces.length >0){
                System.out.print(" implements ");
                //这里定义的k仅作为判断打印的时候是否需要加逗号
                int k = 0;
                for (Class anInterface : interfaces) {
                    if(++k < interfaces.length){
                        System.out.print(anInterface.getSimpleName()+",");
                    }else{
                        System.out.print(anInterface.getSimpleName());
                    }
                }
            }

            System.out.println("{");
            //获取所有的属性
            Field[] Fields = c.getDeclaredFields();
            for (Field field : Fields) {
                System.out.println("   "+Modifier.toString(field.getModifiers())+" "+field.getType().getSimpleName()+" "+field.getName()+";");
            }
            System.out.println();
            //打印所有的构造方法
            Constructor[] constructors = c.getDeclaredConstructors();
            int j = 0; //用来判断是否需要加逗号
            for (Constructor constructor : constructors) {
                System.out.print("   "+Modifier.toString(constructor.getModifiers())+" "+c.getSimpleName()+"(");
                Parameter[] parameters = constructor.getParameters();
                int num = constructor.getParameterCount();
                for (Parameter parameter : parameters) {
                    if(++j < num){
                        System.out.print(parameter.getType().getSimpleName()+" "+parameter.getName()+",");
                    }else{
                        System.out.print(parameter.getType().getSimpleName()+" "+parameter.getName());
                    }
                }
                j = 0; //恢复变量值
                System.out.println(");");
            }
            System.out.println();

            //获取所有方法
            Method[] methods = c.getDeclaredMethods();
            int i =0; //定义一个变量用来判断是否需要加逗号
            for (Method method : methods) {
                System.out.print("   "+Modifier.toString(method.getModifiers())+" "+method.getReturnType().getSimpleName()+" "+method.getName()
                        +"(");
                int nums = method.getParameterCount();

                for (Parameter parameter : method.getParameters()) {
                    if(++i < nums)
                        System.out.print(parameter.getType().getSimpleName()+" "+parameter.getName()+",");
                    else{
                        System.out.print(parameter.getType().getSimpleName()+" "+parameter.getName());
                    }
                }
                i = 0;
                System.out.println("){...}");

            }
            System.out.println();
            System.out.println("  }");

        } catch (Exception e) {
            e.toString();
        }

    }
}

方法没有什么难度,测试一下

@Test
public void test(){
   MyReflect.reflect("java.lang.String");
}

打印结果:
仅显示部分截图,测试了一下没有bug

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值