1. 程式人生 > >深入位元組碼 -- 使用 ASM 實現 AOP

深入位元組碼 -- 使用 ASM 實現 AOP

轉自:http://my.oschina.net/u/1166271/blog/162796?fromerr=Z7KbK3cz

 AOP 的概念已經不是什麼新鮮事物,所以我在這裡就不在介紹 Aop 的概念。目前市面上要做到 Aop 是一件十分簡單的事情。Spring、AspectJ、CGLib等等都可以幫助你達到目的,但是它們也只不過是一些泛生品。

    上面提到了一些開源的 Aop 實現技術選型,但是我敢說無論你嘗試使用上面哪種技術選型都沒有我將要介紹的這種方式的執行效率最高。不過讀者不要高興的太早,讀完本文想必你就知道是什麼原因了。

    ASM 是一個 Java 位元組碼操控框架。它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進位制 class 檔案,也可以在類被載入入 Java 虛擬機器之前動態改變類行為。Java class 被儲存在嚴格格式定義的 .class 檔案裡,這些類檔案擁有足夠的元資料來解析類中的所有元素:類名稱、方法、屬性以及 Java 位元組碼(指令)。ASM 從類檔案中讀入資訊後,能夠改變類行為,分析類資訊,甚至能夠根據使用者要求生成新類。

    可以負責任的告訴大家,ASM只不過是通過 “Visitor” 模式將 “.class” 類檔案的內容從頭到尾掃描一遍。因此如果你抱著任何更苛刻的要求最後都將失望而歸。上面我們介紹的那些 Aop 框架它們幾乎都屬於 ASM 框架的泛生品。

    眾所周知,Aop 無論概念有多麼深奧。它無非就是一個“Propxy模式”。被代理的方法在呼叫前後作為代理程式可以做一些預先和後續的操作。這一點想必讀者都能達到一個共識。因此要想實現 Aop 的關鍵是,如何將我們的程式碼安插到被呼叫方法的相應位置。

    而要追求 Aop 最快的效率的方法也正式將我們要執行的程式碼直接安插到相應的位置。先看一段最簡單的程式碼。

?
1 2 3 4 5 public class TestBean { public void halloAop() { System.out.println("Hello Aop"); } }

    接下來我要為 halloAop 這個方法加裝一個Aop,使在它之前和之後各列印一段字串。最後的程式碼執行起來看上去應該是這個樣子的:

?
1 2 3 4 5 6 7 public class TestBean { public void halloAop() { System.out.println("before"); System.out.println("Hello Aop"); System.out.println("after"); } }

    首先使用 javac 上面類,然後通過javap -c 檢視它們的程式碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ javap -c TestBean Compiled from "TestBean.java" public class

相關推薦

深入位元組 -- 使用 ASM 實現 AOP

轉自:http://my.oschina.net/u/1166271/blog/162796?fromerr=Z7KbK3cz  AOP 的概念已經不是什麼新鮮事物,所以我在這裡就不在介紹 Aop 的概念。目前市面上要做到 Aop 是一件十分簡單的事情。Spri

位元組實踐 -- 使用 ASM 實現 AOP

     ASM 是一個 Java 位元組碼操控框架。它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進位制 class 檔案,也可以在類被載入入 Java 虛擬機器之前動態改變類行為。Java class 被儲存在嚴格格式定義的 .class 檔案裡,這

[譯]深入位元組操作:使用ASM和Javassist建立稽核日誌

深入位元組碼操作:使用ASM和Javassist建立稽核日誌 在堆疊中使用Spring和Hibernate,您的應用程式的位元組碼可能會在執行時被增強或處理。 位元組碼是Java虛擬機器(JVM)的指令集,所有在JVM上執行的語言都必須最終編譯為位元組碼。

Android Kotlin 學習總結(一) 《KAE 優缺點並且深入位元組分析工作原理》

本章會分為以下內容: 1.Kotlin KAE介紹,使用和原始Android findViewById對比優缺點 2.Kotlin KAE所存在的問題 3.通過位元組碼分析他的實現原理 閱讀本章內容大概需要您5分鐘的時間 一、Kotlin KAE介紹,使用和原始

深入位元組 -- 計算方法執行時間(ONE APM基礎原理窺探)

市面上有聽雲、oneapm等效能分析工具,通過對使用的APK反編譯分析,他們提供的PLUGIN都做了很重要的一件事情,就是在class檔案進行了程式碼打點, 也就是在實際的程式碼上做了他們自己的一些程式碼以便於用於效能分析。 詳細的技術參考:http://www.tuico

使用JVM TI技術插裝位元組實現Java程式碼執行控監Agent

        JVM TI技術是JAVA5以後的版本推出的技術,即JVM程式設計介面,該技術廣泛應用於各種開發工具,例如Eclipse等。使用JVM TI可以開發JAVA除錯工具,JAVA程式碼執行監控工具等。同時,瞭解JVM TI技術也有助於JAVA程式設計師深入瞭解J

使用ASM實現AOP(2) -- 玩轉 ASM-Bytecode

轉自:http://my.oschina.net/u/1166271/blog/163550   本文是《深入位元組碼 -- 使用 ASM 實現 AOP》的後續博文。在上一篇文章中介紹瞭如何使用 ASM 動態安插程式碼到類中,從而簡單實現 Aop。文章得

Java位元組插樁修改HiBeaver(結合ASM實現Hook需求、輕量級AOP、無埋點統計上報等)

Java彙編指令- https://segmentfault.com/a/1190000008606277 一次Android位元組碼插樁實戰- https://segmentfault.com/a/1190000008658815 Android位元組碼修改神器HiBeav

Android 音視頻深入 十五 FFmpeg 實現基於Rtmp協議的推流(附源下載)

音視頻 FFmpeg Rtmp 推流 源碼地址https://github.com/979451341/Rtmp 1.配置RTMP服務器 這個我不多說貼兩個博客分別是在mac和windows環境上的,大家跟著弄MAC搭建RTMP服務器https://www.jianshu.com/p/6fce

Java類載入器( CLassLoader ) 死磕8: 使用ASM,和類載入器實現AOP

【正文】Java類載入器(  CLassLoader ) 死磕8:  使用ASM,和類載入器實現AOP 本小節目錄 8.1. ASM位元組碼操作框架簡介 8.2. ASM和訪問者模式 8.3. 用於增強位元組碼的事務類 8.4 通過ASM訪問註解 8.5. 通過ASM注入AOP事務程式

深入理解java虛擬機器(六)位元組指令簡介

Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、

深入理解java位元組

Javap 反編譯class檔案 –verbose 顯示冗餘資訊 (1)魔數:所有的class位元組碼檔案的4個位元組都是魔數,魔數固定值:0xCAFEBABE (2)版本:魔數之後4個位元組是版本資訊,前兩個位元組minor version次版本號例如0,後兩個位元組是主機板號majo

使用 javassist 修改位元組實現 eureka-client 監聽服務啟動

專案中一些服務需要監聽其他微服務的啟動資訊,需要監聽到啟動後主動向其發請求拉取一些配置等。 可是eureka-client並未提供監聽其他服務啟動的事件,eureka-server倒是提供了事件, 可以在自己的eureka-server中監聽服務啟動,監聽後傳送服務啟動資訊到kafka這些訊息佇列,服務監聽k

位元組看java型別轉換 ( 深入理解 (T[]) new Object[size] )

  我們都知道,java中對型別的檢查是很嚴格的,所以我們平操作時,也往往很小心。   如題: (T[]) new Object[size],這種寫法是一般我們是不會幹的!但是有點經驗的同學,還是會遇到這樣寫的。那麼,今天咱們就來看看,像這樣的寫法對不對,也順便深入理解java的型別轉換機制吧!

深入理解Java虛擬機器(七)位元組執行引擎(棧幀、動態連線、方法呼叫)

執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第7篇:虛擬機器位元組執行引擎

上一篇:虛擬機器類載入機制:https://blog.csdn.net/pcwl1206/article/details/84260914 第7篇:虛擬機器位元組碼執行引擎 執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力

從 Java 位元組ASM 實踐

1. 概述 AOP(面向切面程式設計)的概念現在已經應用的非常廣泛了,下面是從百度百科上摘抄的一段解釋,比較淺顯易懂 在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP

深入理解Java虛擬機器(類檔案結構+類載入機制+位元組執行引擎)

周志明的《深入理解Java虛擬機器》很好很強大,閱讀起來頗有點費勁,尤其是當你跟隨作者的思路一直探究下去,開始會讓你弄不清方向,難免有些你說的啥子的感覺。但知識不得不學,於是天天看,反覆看,就慢慢的理解了。我其實不想說這種硬磨的方法有多好,我甚至不推薦,我建議大家閱讀這本書時,由淺入深,有舍有得,先從巨集觀去

深入理解JVM虛擬機器讀書筆記【第八章】虛擬機器位元組執行引擎

8.1 概述 8.2 執行時棧幀結構 8.2.1 區域性變量表 8.2.2 運算元棧 8.2.3 動態連線 8.2.4 方法返回地址

深入理解 Java 虛擬機器筆記】虛擬機器位元組執行引擎

7.虛擬機器位元組碼執行引擎 執行引擎是 Java 虛擬機器最核心的組成部分之一。在 Java 虛擬機器規範中制定了虛擬機器位元組碼執行引擎的概念模型,這個概念模型成為各種虛擬機器執行引擎的統一外觀(Facade)。不同的虛擬機器實現,執行引擎可能會有解釋執行和編譯執行兩種,有可能兩