工作了有一段时间了,我觉得是时候去复习下Java的一些基础知识,因此写下了这篇文章。平常开发过程中,前端写的比较多,后端也不能忘!
一. 案例出发
先准备一个模板类:
public class User { public int id; private String name; public User(String name, int id) { this.id = id; this.name = name; } private User(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
开始反射
import java.lang.reflect.*; public class Test { public static final String LINE = "\n"; public static final String SPACE = " "; public static void main(String[] args) throws Exception { Class<?> c = Class.forName("com.User"); // Class<?> c = Test.class.getClassLoader().loadClass("com.User"); StringBuilder sb = new StringBuilder(); // 打印包,类名 String packageName = c.getPackage().getName(); sb.append("package " + packageName + ";" + LINE); sb.append(LINE); sb.append("public class " + c.getSimpleName() + "{" + LINE); // 打印成员变量 Field[] declaredFields = c.getDeclaredFields(); for (Field field : declaredFields) { // Field.getModifiers()返回一个int类型的数值,用于标识public、static等标识符 String fieldModifier = Modifier.toString(field.getModifiers()); // 获取属性类型的简要名称 String typeName = field.getType().getSimpleName(); // 属性的名称 String fieldName = field.getName(); sb.append(SPACE + fieldModifier + " " + typeName + " " + fieldName + ";" + LINE); } sb.append(LINE); // 打印构造 Constructor<?>[] declaredConstructors = c.getDeclaredConstructors(); for (Constructor<?> constructor : declaredConstructors) { // 构造函数的标识符 String constructorModifier = Modifier.toString(constructor.getModifiers()); sb.append(SPACE + constructorModifier + " " + c.getSimpleName() + " " + "("); // 打印构造函数的参数 printParam(sb, constructor.getParameterTypes()); } // 打印方法 Method[] methods = c.getDeclaredMethods(); for (Method method : methods) { // 方法的标识符 String methodModifier = Modifier.toString(method.getModifiers()); // 方法返回类型 String returnTypeName = method.getReturnType().getSimpleName(); // 方法名称 String methodName = method.getName(); sb.append(SPACE + methodModifier + " " + returnTypeName + " " + methodName + "("); printParam(sb, method.getParameterTypes()); } sb.append("}"); System.out.println(sb.toString()); } private static void printParam(StringBuilder sb, Class<?>[] parameterTypes2) { Class<?>[] parameterTypes = parameterTypes2; for (int i = 0; i < parameterTypes.length; i++) { <a style="color:transparent">来@源gao*daima.com搞@代#码网</a> // 参数的类型 String simpleName = parameterTypes[i].getSimpleName(); if (i == 0) { sb.append(simpleName + " args"); } else { sb.append(", " + simpleName + " args"); } } sb.append(") {" + LINE); sb.append(SPACE + "}" + LINE); sb.append(LINE); } }