今天突然想到原先写过的一个反射类的效率问题,通过测试发现反射获取值的时间为直接获取值时间的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); } } }
相关推荐
这些代码可能包括创建枚举类,然后通过反射获取枚举值、实例名以及演示如何使用`getDeclaredConstructor()`和`newInstance()`方法来访问私有构造函数(虽然这不是常规用法)。 通过深入理解这些概念,你可以更好地...
本教程将深入探讨如何通过反射获取类、方法上的注解以及注解中的值和方法参数。 1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已...
接下来,我们创建一个名为`ReflectorClass`的辅助类,其中包含一个静态方法`getPropertyName`,这个方法接受一个对象实例作为参数,通过反射获取该对象的所有属性名及对应的类型,并返回一个字符串,每个属性名与...
在深入探讨如何通过反射获取实体类的字段和值之前,我们先来理解一下反射是什么以及它在.NET框架中的作用。反射是一种强大的编程技术,允许运行时动态地获取类型的信息并操作对象。它提供了对程序集、模块、类型、...
它演示了如何通过工厂设计模式创建缓存管理器,利用反射动态获取和操作对象,同时利用单例模式确保缓存工具类在整个应用中的唯一性。通过学习和分析这个示例,开发者可以深入理解这些核心概念并将其应用到自己的项目...
本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...
接下来,我们将通过一个具体的例子来演示如何使用Java反射获取内部类的静态成员变量的值。 ##### 示例代码分析 假设我们有如下的类结构: ```java public class Goods { static class Apple { // 内部类 public ...
这些`Field`对象提供了设置和获取字段值的能力,通过`set()`和`get()`方法。 ```java Class<?> clazz = Class.forName("com.example.YourClass"); Field[] fields = clazz.getDeclaredFields(); for (Field ...
在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细介绍这些内容。 1. **获取所有属性**: 在Java中,`java.lang.Class` 类提供了获取类属性的方法。...
在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的动态性至关重要。 首先,我们需要了解`java.lang.Class`类,它是Java中所有类的通用表示。当我们知道一个类的名字...
反射获取属性和调用方法是其核心功能,广泛应用于框架设计、动态代理、插件机制等领域。下面将详细解释这两个概念。 1. 反射获取属性: 在Java中,`java.lang.reflect`包提供了`Class`类来获取类的信息,包括其...
#### 二、反射获取类中的属性及值 下面,我们将通过具体的代码示例来展示如何使用反射来获取类中的所有属性及其对应的值。 ##### 1. 获取类的信息 首先,我们需要获取目标类的信息。这里使用`getClass()`方法来...
本文将深入探讨如何使用反射在Java中获取和设置对象的值,这是许多高级编程任务中不可或缺的一部分。 首先,让我们理解反射的基本概念。在Java中,反射API是`java.lang.reflect`包提供的,它允许我们执行以下操作:...
在C#编程中,反射是一种强大的机制,它允许我们在运行时检查类型信息并动态地创建对象、调用方法、访问属性或字段。本教程将深入探讨如何使用C#的反射来调用对象成员,这对于编写灵活和高度自适应的代码至关重要。 ...
"Java利用反射获取object的属性和值代码示例" Java中的反射机制可以让我们在程序运行时动态地获取和修改对象的属性和值,这个技术非常有用,尤其是在一些框架和库的实现中。在这篇文章中,我们将通过一个实用的例子...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部结构,包括类的属性、方法以及构造器。...通过上述步骤,你可以有效地利用反射获取和操作类的父类属性和方法。
C# 通过属性名字符串获取、设置对象属性值操作示例主要介绍了 C# 通过反射获取对象属性值并设置属性值、获取对象的所有属性名称及类型等相关操作技巧。下面是详细的知识点解释: 一、通过反射获取对象属性值 在 C#...
本文将深入探讨如何通过反射获取类的自定义特性,并创建和使用自定义特性类。 首先,我们需要理解什么是特性(Attribute)。在.NET框架中,特性是一种元数据,可以附加到代码元素(如类、方法、属性等)上,为...
在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让我们从`Person.java`这个实体类开始。在Java中,实体类通常用于表示数据对象,比如一个用户或者订单。实体类可能包含...
这里,`@Retention(RetentionPolicy.RUNTIME)` 表示该注解会在运行时保留,以便于反射获取;`@Target(ElementType.FIELD)` 指定注解可以应用于字段。 接下来,我们可以创建一个类并使用自定义注解标记某个字段: `...