模拟反编译,输出一个类的属性及方法:
测试代码:
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);
}
}
运行截图: