欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

AOP 的利器:ASM 3.0 介紹(4)

系統 1686 0
ASM 通過樹這種數據結構來表示復雜的字節碼結構,并利用 Push 模型來對樹進行遍歷,在遍歷過程中對字節碼進行修改。所謂的 Push 模型類似于簡單的 Visitor 設計模式,因為需要處理字節碼結構是固定的,所以不需要專門抽象出一種 Vistable 接口,而只需要提供 Visitor 接口。所謂 Visitor 模式和 Iterator 模式有點類似,它們都被用來遍歷一些復雜的數據結構。Visitor 相當于用戶派出的代表,深入到算法內部,由算法安排訪問行程。Visitor 代表可以更換,但對算法流程無法干涉,因此是被動的,這也是它和 Iterator 模式由用戶主動調遣算法方式的最大的區別。
在 ASM 中,提供了一個 ClassReader 類,這個類可以直接由字節數組或由 class 文件間接的獲得字節碼數據,它能正確的分析字節碼,構建出抽象的樹在內存中表示字節碼。它會調用 accept 方法,這個方法接受一個實現了 ClassVisitor 接口的對象實例作為參數,然后依次調用 ClassVisitor 接口的各個方法。字節碼空間上的偏移被轉換成 visit 事件時間上調用的先后,所謂 visit 事件是指對各種不同 visit 函數的調用, ClassReader 知道如何調用各種 visit 函數。在這個過程中用戶無法對操作進行干涉,所以遍歷的算法是確定的,用戶可以做的是提供不同的 Visitor 來對字節碼樹進行不同的修改。 ClassVisitor 會產生一些子過程,比如 visitMethod 會返回一個實現 MethordVisitor 接口的實例, visitField 會返回一個實現 FieldVisitor 接口的實例,完成子過程后控制返回到父過程,繼續訪問下一節點。因此對于 ClassReader 來說,其內部順序訪問是有一定要求的。實際上用戶還可以不通過 ClassReader 類,自行手工控制這個流程,只要按照一定的順序,各個 visit 事件被先后正確的調用,最后就能生成可以被正確加載的字節碼。當然獲得更大靈活性的同時也加大了調整字節碼的復雜度。
各個 ClassVisitor 通過職責鏈 (Chain-of-responsibility) 模式,可以非常簡單的封裝對字節碼的各種修改,而無須關注字節碼的字節偏移,因為這些實現細節對于用戶都被隱藏了,用戶要做的只是覆寫相應的 visit 函數。
ClassAdaptor 類實現了 ClassVisitor 接口所定義的所有函數,當新建一個 ClassAdaptor 對象的時候,需要傳入一個實現了 ClassVisitor 接口的對象,作為職責鏈中的下一個訪問者 (Visitor),這些函數的默認實現就是簡單的把調用委派給這個對象,然后依次傳遞下去形成職責鏈。當用戶需要對字節碼進行調整時,只需從 ClassAdaptor 類派生出一個子類,覆寫需要修改的方法,完成相應功能后再把調用傳遞下去。這樣,用戶無需考慮字節偏移,就可以很方便的控制字節碼。
每個 ClassAdaptor 類的派生類可以僅封裝單一功能,比如刪除某函數、修改字段可見性等等,然后再加入到職責鏈中,這樣耦合更小,重用的概率也更大,但代價是產生很多小對象, 而且職責鏈的層次太長的話也會加大系統調用的開銷,用戶需要在低耦合和高效率之間作出權衡。用戶可以通過控制職責鏈中 visit 事件的過程,對類文件進行如下操作:
  1. 刪除類的字段、方法、指令:只需在職責鏈傳遞過程中中斷委派,不訪問相應的 visit 方法即可,比如刪除方法時只需直接返回 null ,而不是返回由 visitMethod 方法返回的 MethodVisitor 對象。
                    class DelLoginClassAdapter extends ClassAdapter {
    	public DelLoginClassAdapter(ClassVisitor cv) {
    		super(cv);
    	}
    	public MethodVisitor visitMethod(final int access, final String name,
    		final String desc, final String signature, final String[] exceptions) {
    		if (name.equals("login")) {
    			return null;
    		}
    		return cv.visitMethod(access, name, desc, signature, exceptions);
    	}
    }
             
                  

  2. 修改類、字段、方法的名字或修飾符:在職責鏈傳遞過程中替換調用參數。
                    class AccessClassAdapter extends ClassAdapter {
    	public AccessClassAdapter(ClassVisitor cv) {
    		super(cv);
    	}
    	public FieldVisitor visitField(final int access, final String name,
            final String desc, final String signature, final Object value) {
            int privateAccess = Opcodes.ACC_PRIVATE;
            return cv.visitField(privateAccess, name, desc, signature, value);
        }
    }
             
                  

  3. 增加新的類、方法、字段
ASM 的最終的目的是生成可以被正常裝載的 class 文件,因此其框架結構為客戶提供了一個生成字節碼的工具類 —— ClassWriter 。它實現了 ClassVisitor 接口,而且含有一個 toByteArray() 函數,返回生成的字節碼的字節流,將字節流寫回文件即可生產調整后的 class 文件。一般它都作為職責鏈的終點,把所有 visit 事件的先后調用(時間上的先后),最終轉換成字節碼的位置的調整(空間上的前后),如下例:
            ClassWriter  classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassAdaptor delLoginClassAdaptor = new DelLoginClassAdapter(classWriter);
ClassAdaptor accessClassAdaptor = new AccessClassAdaptor(delLoginClassAdaptor);
	
ClassReader classReader = new ClassReader(strFileName);
classReader.accept(classAdapter, ClassReader.SKIP_DEBUG);
         
          

?

綜上所述,ASM 的時序圖如下:


圖 4. ASM – 時序圖
圖

AOP 的利器:ASM 3.0 介紹(4)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品欧美一区二区三区不卡 | 日本无卡码免费一区二区三区 | 久久综合久色欧美综合狠狠 | 天天怕夜夜怕狠狠怕 | 日韩成人精品在线 | 999精品国产人妻无码系列久久 | 国产欧美日本 | 国产精品一二区 | 韩国久久久久无码国产精品 | 91最新在线视频 | 国产精品第三页在线看 | 午夜视频在线 | 很黄很暴力深夜爽爽无遮挡 | 国产福利福利视频 | 日韩国产欧美在线观看一区二区 | 日本美女一区二区三区 | 黑白禁区谭小四 | 亚洲一区在线免费 | 日本高清视频wwww色 | 99精品电影 | 泰国一级淫片在线观看 | ak福利视频 | 亚洲天堂三级 | 欧美激情欧美激情在线五月 | 天天色av | 国产在线精品香蕉综合网一区 | 国产一区精品视频 | 一级在线观看 | 黄瓜av | 香港三日本三级三级三级 | 我不卡午夜 | 色AV亚洲AV永久无码精品软件 | 亚洲婷婷国产精品电影人久久 | 波多野结衣免费线在线 | 久草最新视频 | 久久草在线视频 | 亚洲欧美日韩在线不卡中文 | 国产亚洲欧美在线人成aaaa | 91亚洲国产成人精品性色 | 国产福利不卡一区二区三区 | 欧美在线观看一区二区 |