v关键技术剖析
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.html buf.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(); } }
v输出结果
/*类的声明*/ 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); }