六、反射类分析
来源:互联网 发布: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
- 六、反射类分析
- 反射六
- 利用反射分析类
- 利用反射,分析类
- 类反射机制分析
- Java反射六 类的注解
- 利用反射分析类的能力,使用反射分析对象
- Java 类反射机制分析
- Java 类反射机制分析
- Java反射(二)利用反射分析类的能力
- (Java基础--反射)透彻分析反射的基础--Class类
- 初识Java反射——使用反射分析类
- 利用反射分析类,查看类内部
- core java 例题 利用反射分析类
- 利用反射分析类的内部数据
- 透彻分析反射的基础_Class类
- 反射相关类Class接口列表分析
- 反射相关类Method接口列表分析
- 第13周项目6-体验文件操作(5)工资排序
- 用c#输出杨辉三角
- 第一视角看小米,米4购机体验
- android开发中出现的问题集锦
- Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决
- 六、反射类分析
- js判断文本框输入的是否是数字
- 将本地txt文档内容导入到NSMutableDictionary(动态字典)
- 数据结构--树
- C语言的指针
- 检测金额
- 黑马程序员——Java基础---IO流(File类、Properties类、其他流)
- iPad 编程 分割视图
- 设置Eclipse中的Courier New字体