ReflectASM詳解

概述

ReflectASM是一個很小的java類庫,它僅僅有5個類,但是卻提供了非常高性能的屬性操作、方法調(diào)用、構(gòu)造方法調(diào)用,它在底層使用了asm(https://www.ibm.com/developerworks/cn/java/j-lo-asm30/index.html)動態(tài)構(gòu)建出字節(jié)碼,這相比于反射,直接方法的調(diào)用性能高出很多。

可以看下官方給出的性能對比:


image.png

原理分析

以MethodAccess為例,使用方式很簡單

MethodAccess access = MethodAccess.get(SomeClass.class);
access.invoke(someObject, "setName", "abc");

通過get方法得到某個類的加強類,直接調(diào)用類上的setName完成方法的調(diào)用,主要的過程便是在get方法中,它通過asm生成SomeClass的代理類,實現(xiàn)了MethodAccess的invoke方法,方法的內(nèi)容是生成SomeClass的所有方法的調(diào)用index,這樣可以通過指定方法名稱的方式調(diào)用類上的方法。直接調(diào)用類上方法的速度肯定要快于反射調(diào)用了

復制類

應用中用到從一個類到另外一個類的copy使用ReflectASM性能會好很多,具體的方式如下:
其中對于耗時的get操作增加了緩存,代理類生成一次就夠了

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

    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 copyProperties(F from, T to) {
        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" + StringUtils.capitalize(name), null);
                toMethodAccess.invoke(to, "set" + StringUtils.capitalize(name), value);
            } catch (Exception e) {
                // 設(shè)置異常,可能會沒有對應字段,忽略
            }
        }

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Java繼承關(guān)系初始化順序 父類的靜態(tài)變量-->父類的靜態(tài)代碼塊-->子類的靜態(tài)變量-->子類的靜態(tài)代碼快-->父...
    第六象限閱讀 2,261評論 0 9
  • 反射,它就像是一種魔法,引入運行時自省能力,賦予了 Java 語言令人意外的活力,通過運行時操作元數(shù)據(jù)或?qū)ο?,Ja...
    小刀愛編程閱讀 870評論 0 4
  • 秋葉無聲 指尖的溫柔 你最靈動
    陳婷婷yy閱讀 251評論 0 0
  • 看海去 看海去喲! 車從鄭州出發(fā),過荷澤、鄆城、梁山、濟...
    醉茶子閱讀 408評論 0 0
  • 金甲呼嘯山河骸,寒月盡噬千骨債。 赤血殷染君王釵,馬蹄踐踏菊花臺。
    大咪風兒閱讀 420評論 1 4

友情鏈接更多精彩內(nèi)容