今天突然想到原先写过的一个反射类的效率问题,通过测试发现反射获取值的时间为直接获取值时间的9倍左右,于是加一个map缓存一部分结果,效率获得明显的提升取值时间大概为直接取值的三倍左右。
测试代码不贴了
测试结果
循环100000次
反射:890ms左右
加入map:300ms左右
直接调用:100ms左右
下面贴出改进代码
import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class ReflectHelper { private static Map<Class<?>, Map<String, Field>> map = new HashMap<Class<?>, Map<String, Field>>(); /** * 获取obj对象fieldName的Field * * @param obj * @param fieldName * @return */ public static Field getFieldByFieldName(Object obj, String fieldName) { Class<?> objClass = obj.getClass(); Map<String, Field> cMap = map.get(objClass); if (cMap != null) { Field f = cMap.get(fieldName); if (f != null) { return f; } } else { cMap = new HashMap<String, Field>(); map.put(objClass, cMap); } for (Class<?> superClass = objClass; superClass != Object.class; superClass = superClass.getSuperclass()) { try { Field field = superClass.getDeclaredField(fieldName); cMap.put(fieldName, field); return field; } catch (NoSuchFieldException e) { } } return null; } /** * 获取obj对象fieldName的属性值 * * @param obj * @param fieldName * @return * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalArgumentException * @throws IllegalAccessException */ public static Object getValueByFieldName(Object obj, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field field = getFieldByFieldName(obj, fieldName); Object value = null; if (field != null) { if (field.isAccessible()) { value = field.get(obj); } else { field.setAccessible(true); value = field.get(obj); field.setAccessible(false); } } return value; } /** * 设置obj对象fieldName的属性值 * * @param obj * @param fieldName * @param value * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalArgumentException * @throws IllegalAccessException */ public static void setValueByFieldName(Object obj, String fieldName, Object value) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field field = obj.getClass().getDeclaredField(fieldName); if (field.isAccessible()) { field.set(obj, value); } else { field.setAccessible(true); field.set(obj, value); field.setAccessible(false); } } }
相关推荐
java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名。本项目为普通java项目
利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性...
java 通过反射获取类上注解,方法上注解,注解里的值及方法参数,项目为maven项目。导入时记得选择maven项目
通过反射获得实体类的字段和值
该篇文章主要介绍当我们碰到参数或者返回值是一个对象时,如何通过frida反射调用该对象的方法(methods)与获取该对象的字段(fields)。感兴趣的朋友可以下载下来看看,了解了解
java反射,获取所有属性、方法以及List集合类
使用Emit,反射,Expression表达式设置和获取实例对象属性的值
(通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无返回值成员方法并使用) (通过反射获取带参带返回值成员...
主要介绍了C#通过属性名字符串获取、设置对象属性值操作,结合实例形式总结分析了C#通过反射获取对象属性值并设置属性值,获取对象的所有属性名称及类型等相关操作技巧,需要的朋友可以参考下
对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): 代码如下: Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach ...
主要介绍了java基于反射得到对象属性值的方法,结合实例形式分析了java基于反射获取对象属性值的相关实现方法与操作技巧,需要的朋友可以参考下
主要介绍了Java利用反射获取object的属性和值代码示例,具有一定借鉴价值,需要的朋友可以参考下。
NULL 博文链接:https://hw1287789687.iteye.com/blog/2154708
ReflectionUtils :反射工具类,包括 ...--- 通过字段名称获得对象中对应的值 --- 驼峰格式字符串转换为下划线格式字符串 ColumnExplain: 使用在实体类字段上,用于标注字段含义,且可以通过反射获取含义
先看说明:https://blog.csdn.net/qq_33789001/article/details/115698506 Unity3d C#实现获取两个对象的夹角值(0--360)项目源码。
主要介绍了Java反射通过Getter方法获取对象VO的属性值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
操作字段:通过反射可以获取和设置对象的字段值,包括公有字段、私有字段等。 动态代理:通过反射可以创建动态代理对象,用于实现特定的代理逻辑。 框架和工具:在很多框架和工具中,如Spring框架、JUnit测试框架...
今天查看yii源码,发现yii\base\Model中的attribute()方法是通过反射获取对象的public non-static属性。记得以前看到的代码都是用get_object_vars()这个函数获取的,昨天查看php文档,发现还可以用foreach遍历对象...
Java基本的反射方法