欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

模拟反编译,输出一个类的属性及方法

程序员文章站 2022-04-04 20:56:09
...

模拟反编译,输出一个类的属性及方法:

测试代码:

package reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test12 {
    public static void main(String[] args) {

        // 反射获取一个类
        String className = "java.lang.Object";
        Class theClass = null;
        try {
            theClass = Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 创建一个字符串拼接对象
        StringBuilder s = new StringBuilder();

        // 连接访问修饰符,类名
        s.append(Modifier.toString(theClass.getModifiers()) + " "
                + theClass.getSimpleName() + " {\n");

        // 获取类中所有的属性成员
        Field[] fields = theClass.getDeclaredFields();
        for (Field f : fields) {
            // 样例:(1)public int id;    (2)String name;
            s.append("    ");  // 制表符
            String modStr = Modifier.toString(f.getModifiers());  // 访问修饰符
            if (!modStr.isEmpty())   s.append(modStr + " ");
            s.append(f.getType().getSimpleName() + " ");  // 变量类型
            s.append(f.getName() + ";\n");  // 变量名
        }

        s.append("\n");

        // 获取类中所有的方法
        Method[] methods = theClass.getDeclaredMethods();
        for (Method m : methods) {
            // 样例:(1)public int doSome(int, String) { }    (2)native void doOther();
            s.append("    ");  // 制表符
            String modStr = Modifier.toString(m.getModifiers());  // 访问修饰符
            if (!modStr.isEmpty())  s.append(modStr + " ");
            s.append(m.getReturnType().getSimpleName() + " ");  // 返回值类型
            s.append(m.getName() + "(");  // 方法名

            // 追加形式参数类型列表
            Class[] parTypes = m.getParameterTypes();
            for (Class par : parTypes) {
                s.append(par.getSimpleName() + ", ");
            }
            if (parTypes.length > 0) {
                s.deleteCharAt(s.length() - 1);  // 删除空格
                s.deleteCharAt(s.length() - 1);  // 删除逗号
            }
            s.append(")");
            // 如果不是抽象方法,也不是native修饰的方法,才有方法体
            if (!modStr.contains("abstract") && !modStr.contains("native")) {
                s.append(" {  }\n");
            } else {  // 是抽象方法或者native修饰的方法,没有方法体,以“;”结尾
                s.append(";\n");
            }
        }

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

    }
}

运行截图:
模拟反编译,输出一个类的属性及方法