通过写一个反编译类的方法来复习一下反射技术
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