首页 > 技术文章 > 反射Constructor

yerun 2020-04-16 15:15 原文

根据 class 文件反编译得到 构造方法

这属于反射的内容,这里的源代码只是反编译 Constructor 得到的构造方法不完整源代码

代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

/**
 * 反编译一个类的Constructor
 */

/**
 * public class Vip {
 *     int no;
 *     String name;
 *     boolean gender;
 *
 *     public Vip() {
 *     }
 *
 *     public Vip(int no){
 *         this.no = no;
 *     }
 *
 *     public Vip(int no, String name) {
 *         this.no = no;
 *         this.name = name;
 *     }
 *
 *     public Vip(int no, String name, boolean gender) {
 *         this.no = no;
 *         this.name = name;
 *         this.gender = gender;
 *     }
 * }
 */
public class ReflectTest11 {
    public static void main(String[] args) {

        StringBuilder s = new StringBuilder();

        try {
//            Class c = Class.forName("com.bjpowernode.javase.bean.Vip");
            Class c = Class.forName("java.lang.String");
            Object obj = c.newInstance();


            s.append(Modifier.toString(c.getModifiers()));
            s.append(" class ");
            s.append(c.getSimpleName());
            s.append(" {\n");

            Constructor[] constructors = c.getDeclaredConstructors();
//            System.out.println(constructors.length);   4
            // 拼接构造方法
            for (Constructor cc : constructors){
                s.append("\t");
                s.append(Modifier.toString(cc.getModifiers()));
                s.append(" ");
                s.append(c.getSimpleName());
                s.append("(");
                // 拼接参数
                Class[] parameterTypes = cc.getParameterTypes();
                for (Class ccc : parameterTypes){
                    s.append(ccc.getSimpleName());
                    s.append(",");
                }
                s.append(") {\n");
                s.append("\t}\n");
            }
            s.append("}");

            System.out.println(s);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

public final class String {
	public String(byte[],) {
	}
	public String(byte[],int,int,) {
	}
	public String(byte[],Charset,) {
	}
	public String(byte[],String,) {
	}
	public String(byte[],int,int,Charset,) {
	}
	 String(char[],int,int,Void,) {
	}
	 String(AbstractStringBuilder,Void,) {
	}
	public String(StringBuilder,) {
	}
	public String(StringBuffer,) {
	}
	 String(byte[],byte,) {
	}
	public String(char[],int,int,) {
	}
	public String(char[],) {
	}
	public String(String,) {
	}
	public String() {
	}
	public String(byte[],int,int,String,) {
	}
	public String(byte[],int,) {
	}
	public String(byte[],int,int,int,) {
	}
	public String(int[],int,int,) {
	}
}

PS:大概写一下,存在较多Bug。

推荐阅读