关键技术剖析
1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包。
2.Class类的forName方法能够根据类名加载类,获得类的Class对象。
Class类的getSuperclass方法获得父类的Class对象;getDeclaredFields方法获取类声明的属性,返回的是一组java.lang.Field对象;getDeclaredConstructors方法获得类的构造方法,返回的是一组java.lang.reflect.Constructor对象;getMethods方法获得类的方法,返回的是一组java.lang.reflect.Method的对象。
3.java.olang.reflect.Field描述类声明的属性。getModifiers方法获得属性的访问修饰符;getType方法获得属性的类型;getName方法获得属性名。
4.java.lang.reflect.Constructor描述类的构造方法。getModifiers方法获得构造方法的访问修饰符;getName方法获得方法名,getParameterTypes获得构造方法的参数类型;getExCeptionTypes方法获得构造方法声明的异常。
5.java.lang.reflect.Method描述类声明的方法。getModifiers方法获得方法的访问修饰符;getReturnType方法返回方法的返回类型;getName方法获得方法名;getParameterTypes方法案获得方法的参数类型;getExceptionTypes方法获得声明的异常。
package com.test;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier;public class Main{/*获取类的声明*/private String getClassStatement(Class c){StringBuffer buf = new StringBuffer();if(c.getName().equals("java.lang.Object")){buf.append("public class Object {");return buf.toString();} else {//得到该类的父类名String superName = c.getSuperclass().getName();buf.append("public class ").append(c.getName()).append(" extends ").append(superName).append(" {");return buf.toString();}}/*获取类的属性*/private String getFields(Class c){StringBuffer buf = new StringBuffer();Field[] fields = c.getDeclaredFields();for(Field field : fields){//获取属性的访问修饰符//Modifier的一些信息 http://www.it165.net/pro/html/201309/7203.htmlbuf.append(" ").append(Modifier.toString(field.getModifiers())).append(" ");Class<?> type = field.getType();buf.append(type.getName()).append(" ");buf.append(field.getName()).append(";\n");}return buf.toString();}/*获取类的所有构造方法*/private String getConstructors(Class c){StringBuffer buf = new StringBuffer();//获取类的构造方法Constructor<?>[] cons = c.getDeclaredConstructors();for(Constructor con : cons){//获取构造方法的访问修饰符buf.append(" ").append(Modifier.toString(con.getModifiers())).append(" ");//获取构造方法的名称buf.append(con.getName()).append("(");//获取构造方法的参数Class<?>[] paramType = con.getParameterTypes();for(int i=0; i<paramType.length; ++i){if(i != 0){buf.append(paramType[i].getName());} else {buf.append(", ").append(paramType[i].getName());}}buf.append(")");//获取方法声明的异常Class<?>[] excepTypes = con.getExceptionTypes();for(int i=0; i<excepTypes.length; ++i){if(i==0){buf.append(" throws ").append(excepTypes[i].getName());} else {buf.append(", ").append(excepTypes[i].getName());}}buf.append(";\n");}return buf.toString();}private String getMethods(Class c){StringBuffer buf = new StringBuffer();Method[] methods = c.getDeclaredMethods();for(Method method : methods){//获取方法的访问修饰符buf.append(" ").append(Modifier.toString(method.getModifiers())).append(" ");//获取方法的返回类型Class<?> returnType = method.getReturnType();buf.append(returnType.getName()).append(" ");buf.append(method.getName()).append(" (");//获取方法的名称//获取方法的参数类型Class<?>[] paramTypes = method.getParameterTypes();for(int i=0; i<paramTypes.length; ++i){if(i==0){buf.append(paramTypes[i].getName());} else {buf.append(", ").append(paramTypes[i].getName());}}buf.append(")");//获取方法声明的异常Class<?>[] excepTypes = method.getExceptionTypes();for(int i=0; i<excepTypes.length; ++i){if(i==0){buf.append(" throws ").append(excepTypes[i].getName());} else {buf.append(", ").append(excepTypes[i].getName());}}buf.append(";\n");}return buf.toString();}public void getClassMessage(){StringBuffer buf = new StringBuffer();try {Class<?> c = Class.forName("com.test.Main");buf.append("/*类的声明*/\n");buf.append(getClassStatement(c));buf.append("\n");buf.append(" /*字段*/\n");buf.append(getFields(c));buf.append(" /*构造器*/\n");buf.append(getConstructors(c));buf.append(" /*方法*/\n");buf.append(getMethods(c));buf.append("}\n");System.out.println(buf.toString());} catch (ClassNotFoundException e) {e.printStackTrace();}}public static void main(String[] args) throws Exception{new Main().getClassMessage();} }
输出结果
/*类的声明*/ public class com.test.Main extends java.lang.Object {/*字段*//*构造器*/public com.test.Main();/*方法*/private java.lang.String getClassStatement (java.lang.Class);public void getClassMessage ();public static void main ([Ljava.lang.String;) throws java.lang.Exception;private java.lang.String getConstructors (java.lang.Class);private java.lang.String getFields (java.lang.Class);private java.lang.String getMethods (java.lang.Class); }