六、反射类分析

来源:互联网 发布:windows系统评级 编辑:程序博客网 时间:2024/04/30 01:34
六、反射 
    原理:反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。
    1.Class类
            获取:Object对象getClass()方法会返回一个Class类型的实例 ;
            方法:
                        forName(pathName) ;   通过class路径获取Class对象
                        newInstance() ;  快速创建一个Class实例
                        
                        getModifiers() ; 返回标识符
                        getName() ; 返回类名字
                        getMethods() ; 返回公有方法  (包括超类公有成员)
                        getFields() ;  返回公有字段  (包括超类公有成员)·

                        getConstructors() 返回公有构造器数组    (包括超类公有成员)
                        getParameterTypes() ; 返回参数类型

                        getMethods() ; 返回全部方法  (不包括超类的成员)
                        getFields() ;  返回全部字段  (不包括超类的成员)
                        getConstructors() 返回全部构造器数组    (不包括超类的成员)
    2.Method类
            获取:通过class.getMethods()获取 ;
            方法:
                        getModifiers() ; 返回标识符
                        getReturnType() ; 返回返回类型
                        getName() ; 返回方法名字
                        getParameterTypes() ;返回参数类型
                            
                        

    3.Field类
            获取:通过class.getFields()获取 ;
            方法:
                        getModifiers() ; 返回标识符
                        getType() ; 返回类型 
                        getName() ;  返回名称

    4.Modifier类
            作用:判断标识符  如public、final、static等
            获取:通过getModifiers() 获取 ;
            方法:
                        toString(int) ; 返回标识符
                        isPublic(int) ; 判断是否公有
                        isPrivate(int) ; 判断是否私有
                        isStatic(int) ; 判断是否公有
                        isFinal(int) ; 判断是否公有

实例:1.类分析器
package net.itaem.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;/** *  * 类分析器 * @author sen * @version 1.0,2014年8月23日 */public class AnalysisUtils {/** * 实现具有防御型单例 */private static final AnalysisUtils analysisUtils = new AnalysisUtils() ;/** * 私有构造函数防止多次实例化 */private AnalysisUtils(){if(analysisUtils==null){}else{//被反射攻击了throw new RuntimeException("AnalysisUtils被反射攻击了") ;}}/** *  * 打印全部类信息 * @author sen * @param clazzName 类路径名 */@SuppressWarnings("rawtypes")public static void printAll(String clazzName){try {/* * 获取类信息 */Class clazz = Class.forName(clazzName); //通过类名加载类/* * 打印 */printAll(clazz) ;} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** *  * 打印全部类信息 * @author sen * @param Object obj实例 */@SuppressWarnings("rawtypes")public static void printAll(Object obj){/* * 获取类信息 */Class clazz = obj.getClass() ; //通过类名加载类/* * 打印 */printAll(clazz) ;}/** *  * 打印全部类信息 * @author sen * @param clazz class类 */@SuppressWarnings("rawtypes")public static void printAll(Class clazz){/* * 获取类信息 */Class superClazz = clazz.getSuperclass() ; //获取超类String modifiers = Modifier.toString(clazz.getModifiers()) ; //获取标识符/* * 打印 */if(modifiers.length() > 0)System.out.print(modifiers + " "); //打印标识符System.out.print("class " + clazz.getName()); //打印类名if(superClazz != null && superClazz != Object.class)System.out.print(" extends " + superClazz.getName()); //打印超类名//打印字段信息System.out.print("\n{\n");printFields(clazz);//打印构造器信息System.out.println();printConstructors(clazz);//打印System.out.println();printMethods(clazz);//尾结束符System.out.println("}");}/** *  * 打印构造器 * @author sen * @param String 类路径 */@SuppressWarnings("rawtypes")public static void printConstructors(String clazzName){try {/* * 获取类信息 */Class clazz = Class.forName(clazzName); //通过类名加载类/* * 打印 */printConstructors(clazz) ;} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** *  * 打印构造器 * @author sen * @param Object 实例 */@SuppressWarnings("rawtypes")public static void printConstructors(Object obj){/* * 获取类信息 */Class clazz = obj.getClass() ; //通过类名加载类/* * 打印 */printConstructors(clazz) ;}/** *  * 打印构造器 * @author sen * @param clazz */@SuppressWarnings("rawtypes")public static void printConstructors(Class clazz){System.out.println("/*构造器*/");/* * 获取类的全部构造器 */Constructor[] constructors = clazz.getDeclaredConstructors() ;/* * 遍历 */for(Constructor c : constructors){/* * 获取构造器信息 */String modifiers = Modifier.toString(c.getModifiers()) ; //获取标识符String name = c.getName() ; //获取名称Class[] paramTypes = c.getParameterTypes() ; //获取参数类型/* * 打印  */System.out.print("") ;if(modifiers.length() > 0)System.out.print(modifiers + " ");//打印标识符System.out.print(name + "("); //打印名称//打印参数for(int typeIndex = 0 ; typeIndex<paramTypes.length; typeIndex++){if(typeIndex>0)System.out.print(", ");if(paramTypes[typeIndex].isArray())System.out.println(paramTypes[typeIndex].getComponentType()+"[]");elseSystem.out.print(paramTypes[typeIndex].getName()); //打印参数}System.out.println(");");}}/** *  * 打印方法 * @author sen * @param String 类路径 */@SuppressWarnings("rawtypes")public static void printMethods(String clazzName){try {/* * 获取类信息 */Class clazz = Class.forName(clazzName); //通过类名加载类/* * 打印 */printMethods(clazz) ;} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** *  * 打印方法 * @author sen * @param Object 实例 */@SuppressWarnings("rawtypes")public static void printMethods(Object obj){/* * 获取类信息 */Class clazz = obj.getClass() ; //通过类名加载类/* * 打印 */printMethods(clazz) ;}/** *  * 打印方法 * @author sen * @param clazz */@SuppressWarnings("rawtypes")public static void printMethods(Class clazz){System.out.println("/*方法*/");/* * 获取类的所有方法 */Method[] methods = clazz.getDeclaredMethods() ;/* * 遍历 */for(Method m : methods){System.out.print("");/* * 获取方法信息 */String modifiers = Modifier.toString(m.getModifiers()); //获取标识符Class retType = m.getReturnType() ; //获取返回类型String name = m.getName() ; //获取方法名Class[] paramTypes = m.getParameterTypes() ; //获取参数/* * 打印 */if(modifiers.length() > 0)System.out.print(modifiers + " "); //打印标识符System.out.print(retType.getName() + " " + name + "("); //打印返回类型和名称//打印参数for(int typeIndex=0; typeIndex<paramTypes.length; typeIndex++){if(typeIndex > 0)System.out.print(", ");if(paramTypes[typeIndex].isArray())System.out.println(paramTypes[typeIndex].getComponentType()+"[]");elseSystem.out.print(paramTypes[typeIndex].getName());}System.out.println(");");}}/** *  * 打印字段 * @author sen * @param String 类路径 */@SuppressWarnings("rawtypes")public static void printFields(String clazzName){try {/* * 获取类信息 */Class clazz = Class.forName(clazzName); //通过类名加载类/* * 打印 */printFields(clazz) ;} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** *  * 打印字段 * @author sen * @param Object 实例 */@SuppressWarnings("rawtypes")public static void printFields(Object obj){/* * 获取类信息 */Class clazz = obj.getClass() ; //通过类名加载类/* * 打印 */printFields(clazz) ;}/** *  * 打印字段信息 * @author sen * @param clazz 类对象 */@SuppressWarnings("rawtypes")public static void printFields(Class clazz){System.out.println("/*字段*/");/* * 获取类的全部字段信息 */Field[] fields = clazz.getDeclaredFields() ;/* * 遍历字段 */for(Field f : fields){System.out.print("");/* * 获取标识符、类型、名称 */String modifiers = Modifier.toString(f.getModifiers()) ; //获取标识符Class type = f.getType() ;  //获取类型String name = f.getName() ; //获取名称/* * 打印 */if(modifiers.length() > 0)System.out.print(modifiers + " "); //打印标识符//打印类型和名称if(type.isArray())System.out.println(type.getComponentType() + "[] " + name + ";");elseSystem.out.println(type.getName() + " " + name + ";"); //打印类型和名称}}}
2.toString()工具类
package net.itaem.reflect;import java.lang.reflect.AccessibleObject;import java.lang.reflect.Array;import java.lang.reflect.Field;import java.lang.reflect.Modifier;/** *  * toString工具类 * @author sen * @version 1.0,2014年8月23日 */public class ToStringUtils {@SuppressWarnings("rawtypes")public static String toString(Object obj){/* * 验证 *///判断是否为空if(obj == null)return "null" ;//获取类对象Class clazz = obj.getClass() ;//判断是否为String类型if(clazz == String.class)return (String)obj ; //直接返回/* * 存储内容 */StringBuilder higher = new StringBuilder() ;  //上级元素/* * 数组类型 */if(clazz.isArray()){higher.append(clazz.getComponentType().getName()).append("[]{") ;//打印数据类型//遍历数组for(int i=0; i<Array.getLength(obj);i++){if(i>0) higher.append(",") ;//获取数组第i个对象Object val = Array.get(obj, i) ;//如果是原始类型if(clazz.getComponentType().isPrimitive())higher.append(val) ;  //原始类型//非原始类型elsehigher.append(toString(val)) ; //递归}//结束符higher.append("}") ;return higher.toString() ;}/* * 非数组类型 */StringBuilder lower = new StringBuilder() ; //下级元素lower.append(clazz.getName()) ;//获取类名称while(clazz != Object.class){lower.append("[") ;/* * 获取全部字段 */Field[] fields = clazz.getDeclaredFields() ;//设置字段可访问权限 ,可查询和设置字段值  ( 默认为false)AccessibleObject.setAccessible(fields, true);/* * 遍历字段 */for(Field f : fields){//非全局字段if(!Modifier.isStatic(f.getModifiers())){if(!lower.toString().endsWith("["))lower.append(",") ;//获取字段名称lower.append(f.getName()).append("=") ;try{//获取字段类型Class t = f.getType() ;//获取字段Object val = f.get(obj) ;//原始类型if(t.isPrimitive())lower.append(val) ;//非原始类型elselower.append(toString(val)) ;} catch(Exception e){e.printStackTrace(); }}}//结束符lower.append("]") ;//父类clazz = clazz.getSuperclass() ;}return lower.toString() ;}}



0 0
原创粉丝点击