- 浏览: 29583 次
- 性别:
- 来自: 南京
文章分类
最新评论
常用的反射工具类ReflectionExtUtil.util
package com.gbcom.system.utils; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.apache.log4j.Logger; /** * 反射工具栏 * * @author syz * @date 2014-5-8 * @version v1.0.0 * @see com.gbcom.dp.reflection.ReflectionExtUtil */ public class ReflectionExtUtil { private static final Logger LOG = Logger.getLogger(ReflectionExtUtil.class); /** * 新建实例,要么不写构造函数,否则必须有一个默认构造函数 * * @param className * 类名 * @param args * 构造函数的参数 * @return 新建的实例 * @throws Exception * Exception */ public static Object newInstance(String className, Object[] args) throws Exception { Class newoneClass = Class.forName(className); if (args == null) { return newoneClass.newInstance(); } Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Constructor cons = newoneClass.getConstructor(argsClass); return cons.newInstance(args); } /** * 是不是某个类的实例 * * @param obj * 实例 * @param cls * 类 * @return 如果 obj 是此类的实例,则返回 true */ public static boolean isInstance(Object obj, Class cls) { return cls.isInstance(obj); } /** * 循环向上转型, 获取对象的 DeclaredMethod * * @param object * : 子类对象 * @param methodName * : 父类中的方法名 * @param parameterTypes * : 父类中的方法参数类型 * @return 父类中的方法对象 */ public static Method getDeclaredMethod(Object object, String methodName, Class<?>... parameterTypes) { Method method = null; for (Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz .getSuperclass()) { try { method = clazz.getDeclaredMethod(methodName, parameterTypes); return method; } catch (Exception e) { // 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 // 如果这里的异常打印或者往外抛,则就不会执行clazz = // clazz.getSuperclass(),最后就不会进入到父类中了 } } return null; } /** * 直接调用对象方法, 而忽略修饰符(private, protected, default) * * @param object * : 子类对象 * @param methodName * : 父类中的方法名 * @param parameterTypes * : 父类中的方法参数类型 * @param parameters * : 父类中的方法参数 * @return 父类中方法的执行结果 */ public static Object invokeMethod(Object object, String methodName, Class<?>[] parameterTypes, Object[] parameters) { // 根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象 Method method = getDeclaredMethod(object, methodName, parameterTypes); // 抑制Java对方法进行检查,主要是针对私有方法而言 method.setAccessible(true); try { if (null != method) { // 调用object 的 method 所代表的方法,其方法的参数是 parameters return method.invoke(object, parameters); } } catch (IllegalArgumentException e) { LOG.error("error",e); } catch (IllegalAccessException e) { LOG.error("error",e); } catch (InvocationTargetException e) { LOG.error("error",e); } return null; } private static Field[] arryConcat(Field[] a, Field[] b) { Field[] c = new Field[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } private static Method[] arryConcat(Method[] a, Method[] b) { Method[] c = new Method[a.length + b.length]; System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } /** * 获取对象的所有属性,包括父类 * * @param object * Object * @return Field [] */ public static Field[] getDeclaredFields(Object object) { Class<?> clazz = object.getClass(); Field[] total = new Field[0]; for (; clazz != Object.class; clazz = clazz.getSuperclass()) { total = (Field[]) arryConcat(total, clazz.getDeclaredFields()); } return total; } /** * 获取对象的所有属性,包括父类 * * @param clazz * Class<?> * @return Field [] */ public static Field[] getDeclaredFields(Class<?> clazz) { Field[] total = new Field[0]; for (; clazz != Object.class; clazz = clazz.getSuperclass()) { total = (Field[]) arryConcat(total, clazz.getDeclaredFields()); } return total; } /** * 获取对象的所有方法 * * @param object * Object * @return Method [] */ public static Method[] getDeclaredMethods(Object object) { Class<?> clazz = object.getClass(); Method[] total = new Method[0]; for (; clazz != Object.class; clazz = clazz.getSuperclass()) { total = (Method[]) arryConcat(total, clazz.getDeclaredMethods()); } return total; } /** * 循环向上转型, 获取对象的 DeclaredField * * @param object * : 子类对象 * @param fieldName * : 父类中的属性名 * @return 父类中的属性对象 */ public static Field getDeclaredField(Object object, String fieldName) { Field field = null; Class<?> clazz = object.getClass(); for (; clazz != Object.class; clazz = clazz.getSuperclass()) { try { field = clazz.getDeclaredField(fieldName); return field; } catch (Exception e) { } } return null; } /** * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter * * @param object * : 子类对象 * @param fieldName * : 父类中的属性名 * @param value * : 将要设置的值 */ public static void setFieldValue(Object object, String fieldName, Object value) { // 根据 对象和属性名通过反射 调用上面的方法获取 Field对象 Field field = getDeclaredField(object, fieldName); // 抑制Java对其的检查 field.setAccessible(true); try { // 将 object 中 field 所代表的值 设置为 value field.set(object, value); } catch (IllegalArgumentException e) { LOG.error("error",e); } catch (IllegalAccessException e) { LOG.error("error",e); } } /** * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter * * @param object * : 子类对象 * @param fieldName * : 父类中的属性名 * @return : 父类中的属性值 */ public static Object getFieldValue(Object object, String fieldName) { // 根据 对象和属性名通过反射 调用上面的方法获取 Field对象 Field field = getDeclaredField(object, fieldName); // 抑制Java对其的检查 field.setAccessible(true); try { // 获取 object 中 field 所代表的属性值 return field.get(object); } catch (Exception e) { LOG.error("error",e); } return null; } /** * 设置属性值 * * @param list * ArrayList * @param cla * Class * @return ArrayList */ @SuppressWarnings("unchecked") public static ArrayList array2bean(ArrayList list, Class cla) { ArrayList result = new ArrayList(); int filedLen = cla.getDeclaredFields().length; System.out.println(":" + cla.getDeclaredFields().length); for (int i = 0; i < list.size(); i++) { Object[] o = (Object[]) list.get(i); int length = filedLen < o.length ? filedLen : o.length; try { result.add(cla.newInstance()); for (int j = 0; j < length; j++) { Method m = null; String mName = cla.getDeclaredFields()[j].getName(); mName = mName.substring(0, 1).toUpperCase() + mName.substring(1); mName = "set" + mName; m = cla.getMethod(mName, new Class[] { String.class }); // 调用设置的方法,给属性赋值 m.invoke(result.get(i), new Object[] { o[j] == null ? "" : o[j].toString() }); } } catch (Exception e) { LOG.error("error",e); } } return result; } /** * * @param cla * String * @param attri * Class * @return Class */ public static Class getAttriTypeByName(Class cla, String attri) { Field[] fds = getDeclaredFields(cla); for (Field field : fds) { if (field.getName().equals(attri)) { return field.getType(); } } return String.class; } /** * 获取对象的所有属性的 valueMap * * @param obj * Object * @return Map<String, Object> * @throws SecurityException * SecurityException * @throws NoSuchMethodException * NoSuchMethodException * @throws IllegalArgumentException * IllegalArgumentException * @throws IllegalAccessException * IllegalAccessException * @throws InvocationTargetException * InvocationTargetException */ public static Map<String, Object> getAttrsValueMap(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Map<String, Object> valueMap = new HashMap<String, Object>(); Class cla = obj.getClass(); Field[] fds = getDeclaredFields(obj); Field field = null; String fieldName = null; String methodName = null; Method method = null; Object returnValue = null; for (int i = 0; i < fds.length; i++) { field = fds[i]; fieldName = field.getName(); methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); method = getDeclaredMethod(obj, methodName, null); if (method == null) { methodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); method = getDeclaredMethod(obj, methodName, null); } if (method == null) { System.out .println("NullPoint exception , of reflection methodName=" + methodName); continue; } returnValue = method.invoke(obj, null);// 调用方法,相当于执行get方法得到的结果,这里返回的是一个对象 valueMap.put(fieldName, returnValue == null ? "" : returnValue); } return valueMap; } /** * 根据MAP 设置对象的所有属性, * * @param obj * Object * @param valueMap * Map<String, Object> * @throws NoSuchMethodException * NoSuchMethodException * @throws SecurityException * SecurityException * @throws InvocationTargetException * InvocationTargetException * @throws IllegalAccessException * IllegalAccessException * @throws IllegalArgumentException * IllegalArgumentException */ public static void setAttrsValueMap(Object obj, Map<String, Object> valueMap) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Class cla = obj.getClass(); String fieldName = null; String methodName = null; Method method = null; for (Entry<String, Object> entry : valueMap.entrySet()) { // 预判断 if (entry.getValue() == null || String.valueOf(entry.getValue()).startsWith("noSuch")) { continue; } fieldName = entry.getKey(); if (fieldName.equals("staticChannel")) { System.out.println("xxx"); } methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Class type = entry.getValue().getClass(); if (type == Integer.class) { type = int.class; } else if (type == Boolean.class) { type = boolean.class; } // Object varObj = convertClxValue(type, entry.getValue()); method = getDeclaredMethod(obj, methodName, type); // if(method == null){ // type = int.class; // method = getDeclaredMethod(obj,methodName, type); // } if (method == null) { System.out .println("NullPoint exception , of reflection methodName=" + methodName); continue; } method.invoke(obj, entry.getValue());// 调用方法,set操作注意 } } private static Object convertClxValue(Object value) { if (value instanceof String) { return String.valueOf(value); } return null; } }
相关推荐
该工具类下载后拷贝到你要用的包,只需该包名即可
一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。
java组件开发(13)反射工具类
java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符...只是个工具类,没有写测试类,自己测试下啊
java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具...
反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...
提供以下几个功能: 1. 取最简类名 2. 动态赋值 3. 动态取值 4. 判断是否普通类型(自定义成员变量) 5. 动态取指定类的所有属性名
Xposed框架的核心是其提供的API,其中`XposedHelper`是一个关键的反射工具类,方便开发者对Android系统的类和方法进行操作。本文将详细介绍如何将`XposedHelper`移植到非Xposed环境中,以及在Java反射技术方面的一些...
进行数据库查询操作经常用到,包括getDeclaredField、getDeclaredMethod、getFieldValue、getSuperClassGenricType、getSuperGenericType、invokeMethod、makeAccessible、setFieldValue
这个"一键换肤,反射工具类"是实现这一功能的关键部分,通过反射技术来实现动态加载不同的主题资源,使得皮肤更换无需重启应用。 反射在Java(包括Android)编程中是一种强大的技术,它允许程序在运行时检查和修改...
在IT行业中,MyBatis、Spring AOP、Spring事务管理和反射工具类是常见的技术栈,它们在构建高效、灵活的企业级应用中起着至关重要的作用。以下是对这些知识点的详细阐述: 1. MyBatis拦截器(MyBatis Interceptor)...
ReflectUtil java反射工具类
Java项目开发用的公用基础模块,包括:Spring容器初始化、配置文件读取工具类、分页对象、Protobuf工具类、反射工具类等
该代码经过作者的优化,可直接使用,反射一个实体,从试题中获取值
ReflectionUtils :反射工具类,包括 --- 通过反射获取实体类中的字段及其中文注释 --- 通过字段名称获得对象中对应的值 --- 驼峰格式字符串转换为下划线格式字符串 ColumnExplain: 使用在实体类字段上,用于标注...
使用的cglib+缓存 1千万次空方法调用 大概3秒~ 直接反射的速度为10秒~ 缓存后反射为 6秒~ 取出安全验证缓存后的速度为 4秒左右~ 另外大概有2秒的性能消耗在字符串拼接缓存中的key造成~ 因此上面带缓存的反射方案...
java 反射工具类,适用于框架开发、平台建设等项目
这个“Java反射调用工具类”可能是为了简化和封装这些复杂的反射操作而创建的一个实用工具类。 首先,`JobProxy.java`可能是一个代理类,它利用反射来动态地调用目标对象的方法。在Java中,代理模式通常用于在不...