`

java利用reflectasm反射

    博客分类:
  • Java
阅读更多
import java.lang.reflect.Field;
import java.util.concurrent.ConcurrentMap;
import com.esotericsoftware.reflectasm.MethodAccess;
import com.google.common.collect.Maps;

public class ReflectUtil {
    private static final ConcurrentMap<Class<?>, MethodAccess> localCache = Maps.newConcurrentMap();

    private ReflectUtil() {

    }

    public static String upperFirstChar(String str) {
        if (str == null || "".equals(str)) {
            return str;
        }
        char[] cs = str.toCharArray();
        cs[0] -= 32;
        return String.valueOf(cs);
    }
    
    public static Object setProperty(Object clazz, String fname, Object fvalue) {
        if (clazz == null) {
            throw new IllegalArgumentException("No bean specified");
        }
        if (fname == null) {
            throw new IllegalArgumentException("No name specified for bean class '" + clazz.getClass() + "'");
        }
        return get(clazz.getClass()).invoke(clazz, "set" + upperFirstChar(fname), fvalue);
    }

    public static Object getProperty(Object clazz, String fname) {
        if (clazz == null) {
            throw new IllegalArgumentException("No bean specified");
        }
        if (fname == null) {
            throw new IllegalArgumentException("No name specified for bean class '" + clazz.getClass() + "'");
        }
        return get(clazz.getClass()).invoke(clazz, "get" + upperFirstChar(fname));
    }

    public static MethodAccess get(Class<?> clazz) {
        if (localCache.containsKey(clazz)) {
            return localCache.get(clazz);
        }

        MethodAccess methodAccess = MethodAccess.get(clazz);
        localCache.putIfAbsent(clazz, methodAccess);
        return methodAccess;
    }

    public static <F, T> void copyPropertiesIgnoreNull(F from, T to) {
        copyProperties(from, to, true);
    }

    public static <F, T> void copyProperties(F from, T to) {
        copyProperties(from, to, false);
    }

    public static <F, T> void copyProperties(F from, T to, boolean ignoreNull) {
        MethodAccess fromMethodAccess = get(from.getClass());
        MethodAccess toMethodAccess = get(to.getClass());
        Field[] fromDeclaredFields = from.getClass().getDeclaredFields();
        for (Field field : fromDeclaredFields) {
            String name = field.getName();
            try {
                Object value = fromMethodAccess.invoke(from, "get" + upperFirstChar(name));
                if (ignoreNull && value == null) {
                    continue;
                }
                toMethodAccess.invoke(to, "set" + upperFirstChar(name), value);
            } catch (Exception e) {
            }
        }
    }
}

 

分享到:
评论

相关推荐

    High performance Java reflection.zip

    综上所述,"High performance Java reflection.zip"可能包含有关如何利用ReflectASM提高Java反射性能的详细信息,这对于优化性能敏感的Java应用程序来说是非常有价值的。学习和掌握这些知识可以帮助开发者更好地平衡...

    helium:Helium是使用ReflectASM的开源事件调度程序

    总的来说,Helium是一个利用ReflectASM提升性能的Java事件调度库,旨在简化事件驱动编程,提高系统的响应性和可扩展性。随着项目的完善,它有望成为Java开发者构建高性能、低延迟应用的重要工具。

    memcached、tomcat集成所需包

    9. **reflectasm-0.9.jar**: ReflectASM是一个轻量级的反射库,用于提高Java反射操作的性能。在Kryo序列化过程中可能会用到。 集成memcached到Tomcat的步骤大致如下: 1. 将上述jar包放入Tomcat的lib目录。 2. ...

    nginx+tomcat7+memcached所需jar

    6. `reflectasm-1.10.1.jar`:ReflectASM是一个用于反射的轻量级库,提高了Java反射性能。 7. `memcached-session-manager-tc7-1.9.5.jar`:这是针对Tomcat 7的特定版本,确保与Tomcat的兼容性。 8. `minlog-1.3.0...

    memcached所需JAR包

    4. **反射库**: `reflectasm-1.01.jar`是一个高效的反射库,用于提升运行时访问Java类和方法的速度。在处理序列化和反序列化时,反射库可以提高性能。 5. **ASM**: `asm-3.2.jar`是一个强大的字节码操作和分析框架...

    jxls开发jar包

    5. `reflectasm`和`access-reflect`:可能用于优化反射操作,提高性能。 6. 其他辅助库:可能包括其他用于XML处理、编译Java表达式等功能的库。 **使用方法** 1. **引入依赖**:将提供的jar包添加到项目类路径中,...

    memcached共享session需要的jar包

    7. **reflectasm-1.01.jar**:ReflectASM是一个轻量级的反射库,比Java标准的反射API更快,它可能被Kryo或memcached-session-manager用于提高性能。 8. **memcached-session-manager-tc7-1.6.5.jar**:这个jar是...

    tomcat8+memcached session共享

    6. `reflectasm-1.09.jar`:ReflectASM是一个用于反射的轻量级库,提高了反射操作的性能,可能在Kryo序列化过程中使用。 7. `memcached-session-manager-tc8-1.8.3.jar`:这个是针对Tomcat 8版本的session管理器实现...

    Kryo所需的依赖包

    - `reflectasm`:一个用于访问和修改Java反射的高效库,Kryo利用它来加速反射操作。 - `asm`:字节码操作库,反射ASM提供底层的字节码操作,可能在某些高级功能中使用。 - `lz4-java`:LZ4压缩库,Kryo可以利用这...

    tomcat6+session+memcached

    - `reflectasm-0.9.jar`: 反射增强库,可能用于提高反射操作的性能。 - `msm-kryo-serializer-1.6.5.jar`: Memcached Session Manager的Kryo序列化模块,用于优化Session的序列化过程。 - `spymemcached-2.10.3....

    session共享jar包

    8. `reflectasm-1.01.jar` 和 `minlog-1.2.jar`:这两个库分别是反射优化和轻量级日志库,它们可能作为Kryo或其它库的依赖,提供性能优化和日志记录功能。 总结起来,这个jar包集合提供了实现Nginx+Memcached ...

    msm_libs.zip

    5. `reflectasm-1.11.4-2.jar`:ReflectASM是一个基于反射的轻量级库,提供更快的访问Java类字段和方法的能力。在处理会话数据时,ReflectASM可能会提升性能,特别是在大量读写会话时。 6. `memcached-session-...

    memcached-session-manager集成包

    5. **reflectasm-1.09-shaded.jar** 和 **asm-3.2.jar**:ReflectASM是一个轻量级、高性能的Java反射库,而ASM是一个底层的Java字节码操作和分析框架。这两个库通常用于类的动态生成和修改,可能在序列化过程中发挥...

    Heritrix3.4爬虫需要的jar包

    4. **reflectasm-0.8.jar**:ReflectASM是一个轻量级的Java反射库,提供了更快的访问类和字段的方法。在Heritrix这样的高性能系统中,反射ASM可以提升运行时动态操作类和对象的性能,特别是在处理大量数据和动态配置...

    负载均衡session共享memcached jar包

    7. `reflectasm-1.01.jar`:反射优化库,可能被Kryo用来提高序列化性能。 8. `memcached-session-manager-tc7-1.6.5.jar`:针对Tomcat 7的特定版本,提供与Tomcat的适配。 9. `minlog-1.2.jar`:一个简单的日志库,...

Global site tag (gtag.js) - Google Analytics