package com.slliver.reflection;
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier;
/** * 利用反射打印一个类的全部信息,构造方法、方法、属性 * * @author slliver * @date 2017-04-13 21:12 */ public class ReflectionTest {
public static void main(String\[\] args) {
String name = "com.slliver.reflection.Student";
try {
Class classzz = Class.forName(name);
// 当前类的父类
Class superClass = classzz.getSuperclass();
// 获取当前类的修饰符
String modifiers = Modifier.toString(classzz.getModifiers());
if (modifiers.length() > 0) {
System.out.println("当前类修饰符 == >>> " + modifiers);
}
if (superClass != null && superClass != Object.class) {
System.out.println("当前类的父类 == >>> " + superClass.getName());
}
System.out.print("\\n{\\n");
System.out.println("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 类构造方法的信息 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*");
printConstructors(classzz);
System.out.println();
System.out.println("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 类中方法的信息 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*");
printMethods(classzz);
System.out.println();
System.out.println("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 类中属性的信息 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*");
printFields(classzz);
System.out.print("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/\*\*
\* 当前类构造方法信息,构造方法的修饰符,构造方法参数类型和参数名称
\*/
private static void printConstructors(Class classzz) {
// 返回所有构造器
Constructor\[\] constructors = classzz.getDeclaredConstructors();
// 当前类所有构造方法
Constructor\[\] currentConstructors = classzz.getConstructors();
for (Constructor constructor : currentConstructors) {
String name = constructor.getName();
System.out.print(" ");
String modifiers = Modifier.toString(constructor.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print(name + "(");
// 构造方法参数类型
Class\[\] paramTypes = constructor.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0) {
System.out.print(", ");
}
// 构造方法参数类型和参数名字
System.out.print(paramTypes\[j\].getName());
}
System.out.println(");");
}
}
/\*\*
\* 当前类中方法信息
\*/
private static void printMethods(Class classzz) {
// 返回所有的共有方法,包括从超类(父类)继承的共有方法
Method\[\] methods = classzz.getMethods();
// 返回当前类的全部方法
Method\[\] currentMethods = classzz.getDeclaredMethods();
for (Method method : currentMethods) {
// 方法返回值
Class returnType = method.getReturnType();
// 方法名
String methodName = method.getName();
System.out.print(" ");
// 方法的修饰符
String modifiers = Modifier.toString(method.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print(returnType.getName() + " " + methodName + " (");
// 方法参数类型
Class\[\] paramTypes = method.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0) {
System.out.print(", ");
}
// 构造方法参数类型和参数名字
System.out.print(paramTypes\[j\].getName());
}
System.out.println(");");
}
}
/\*\*
\* 当前类中属性信息
\*/
private static void printFields(Class classzz) {
// 返回当前类所有公有域(public修饰的属性)
Field\[\] publicFields = classzz.getFields();
// 返回当前类所有属性
Field\[\] fields = classzz.getDeclaredFields();
for (Field field : fields) {
// 属性类型
Class type = field.getType();
// 属性名
String name = field.getName();
System.out.print(" ");
// 属性修饰符
String modifiers = Modifier.toString(field.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print(type.getName() + " " + name + ";\\n");
}
}
}