成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JAVA字節碼文件操作技巧

開發 后端
本文將介紹與操作Java字節碼有關的基本知識和操作Java字節碼的方法及Demo,談到操作Java字節碼,不能不談到AOP,這里向大家做一下簡單介紹。

你知道如何操作JAVA字節碼文件嗎,這里將介紹與操作Java字節碼有關的基本知識和操作Java字節碼的方法及Demo,首先我們來看一下AOP的概念,AOP是OOP的延續,是AspectOrientedProgramming的縮寫,意思是面向方面編程。

如何操作JAVA字節碼文件

本文將介紹與操作Java字節碼有關的基本知識和操作Java字節碼的方法及Demo,談到操作Java字節碼,不能不談到AOP(AspectOrientedProgramming),下面來簡單介紹一下:

AOP簡介

AOP是OOP的延續,是AspectOrientedProgramming的縮寫,意思是面向方面編程。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。

AOP的一個典型應用就是J2EE。J2EE應用系統只有部署在J2EE容器中才能運行,那么為什么劃分為J2EE容器和J2EE應用系統?通過對J2EE容器運行機制的分析,可以發現:實際上J2EE容器分離了一般應用系統的一些通用功能,例如事務機制、安全機制以及對象池或線程池等性能優化機制。

這些功能機制是每個應用系統幾乎都需要的,因此可以從具體應用系統中分離出來,形成一個通用的框架平臺,而且,這些功能機制的設計開發有一定難度,同時運行的穩定性和快速性都非常重要,必須經過長時間調試和運行經驗積累而成,因此,形成了專門的J2EE容器服務器產品,如TomcatJBoss。

簡單了解AOP后,再來了解一下AOP底層技術:

AOP(AspectOrientedProgramming)底層技術比較

AOP底層技術比較

從上面的圖表中分析可以看到,對于一般的操作Java字節碼要求(實際上是能夠滿足筆者100%的要求),綜合考慮功能,性能,可用性,易用性,使用Java字節碼框架來操作Java字節碼是最佳的選擇。

下面來了解一下都有哪些開源操作JavaJava字節碼的框架:

Javassist;

cglib;

SERP;

Packagegnu.bytecode;

Cojen;

Jdec;

BCEL;

ObjectWebASM;

JClassLib;

TroveClassFileAPI;

Jiapi;

ClassfileReader&Writer;

JBET;

Retroweaver;

Jen;

Soot

這里重點介紹一下ASM,因為下面將使用ASM框架進行Java字節碼修改。

ASM這個Java字節碼操控框架能被用來動態生成類或者增強既有類的功能。ASM可以直接產生二進制class文件,也可以在類被加載入Java虛擬機之前動態改變類行為。Javaclass被存儲在嚴格格式定義的.class文件里,這些類文件擁有足夠的元數據來解析類中的所有元素:類名稱、方法、屬性以及Java字節碼(指令)。ASM從類文件中讀入信息后,能夠改變類行為,分析類信息,甚至能夠根據用戶要求生成新類。下圖對當前接觸常用的操作Java字節碼框架進行了一個比較:

操作Java字節碼框架比較 #p#

ASM的幾個特性:

1.JAVABased.

ASM是基于JAVA的,即用JAVA實現的。

2.Visitor模式.

對于ASM來說,Javaclass被描述為一棵樹;使用“Visitor”模式遍歷整個二進制結構。

3.復雜性低.易學易用.

ASM提供了更為現代的編程模型,降低了操作Java字節碼的復雜性,使用事件驅動的處理方式使得用戶只需要關注于對其編程有意義的部分,而不必了解Java類文件格式的所有細節:ASM框架提供了默認的“responsetaker”處理這一切。

4.較高的性能

對Java字節碼進行操作的同時盡量減小的性能的損失(性能的損失是不可避免)。

這里來介紹一下ASM組成及順序圖:

ASM組成及順序圖


Corepackage提供了一個讀寫、修改Javabytecode的API,并且為其它的package定義了依據。這個package對于生成Javabytecode、實現大多數的bytecode變換而言意義重大。

Treepackage提供了Javabytecode的內存表示法。

Analysispackage提供了基本的數據流分析和類型檢查算法,它們將用于在treeoackage中存儲Java方法bytecode。

Commonspackage(包含在ASM2.0中)提供了一些常用的bytecode轉換和用于簡化bytecode生成的適配器。

Utilpackage包含了一些幫助類和簡單的bytecode驗證器,它們將有助于開發或者測試。

XMLpackage提供了一個用于在bytecode和XML之間進行轉換的適配器,和一些允許使用XSLT定義bytecode轉換的兼容SAX的適配器。

順序圖:

ASM順序圖 

Demo

這里我們來實現這樣一個功能:在不能改變原代碼功能的前提下,對于一個特定類的特定方法有沒有被測試過,以HelloTaobao類中方法helloHeyun為例。

類HelloTaobao:

  1. publicclassHelloTaobao  
  2. {  
  3. publicvoidhelloHeyun()  
  4. {  
  5. System.out.println(“Hello,ThisisHeyun’sinvestigationaboutcodecoverage!”);  
  6. }  
  7. }  
  8.  

 主方法類:

  1. publicclassMain  
  2. {  
  3. publicstaticvoidmain(String[]args)  
  4. {  
  5. HelloTaobaoht=newHelloTaobao();  
  6. ht.heyunHeyun();  
  7. }  
  8. }  
  9.  

 到這里,我們運行一下程序,會在Console輸出字符串:“Hello,ThisisHeyun’sinvestigationaboutcodecoverage!”。#p#

下面我們來操作一下Java字節碼文件HelloTaobao.class:

1.想操作Java字節碼的某一方法,需要繼承ASM中的ClassAdapter和MethodAdapter

2.定義類Generator來讀入Java字節碼文件HellTaobao,改造Java字節碼文件,生成改造后的同名Java字節碼文件HellTaobao,代碼如下:

  1. publicclassGenerator  
  2. {  
  3. publicstaticvoidmain(String[]args)throwsException  
  4. {  
  5. ClassReadercr=newClassReader(“HellTaobao”);  
  6.  
  7. ClassWritercw=newClassWriter(ClassWriter.COMPUTE_MAXS);  
  8.  
  9. ClassAdapterclassAdapter=newByteCodeClassHandler(cw);  
  10.  
  11. cr.accept(classAdapter,ClassReader.SKIP_DEBUG);  
  12.  
  13. byte[]data=cw.toByteArray();  
  14.  
  15. Filefile=newFile(“HellTaobao.class”);  
  16.  
  17. FileOutputStreamfout=newFileOutputStream(file);  
  18.  
  19. fout.write(data);  
  20.  
  21. fout.close();  
  22. }  
  23. }  
  24.  

 3.ByteCodeClassHandler(自定義)類繼承ClassAdapter(fromASM)

4.ByteCodeClassHandler類中重寫visitMethod,這個方法里去判斷如果Java字節碼文件HelloTaobao.class包含方法helloHeyun就調用ByteCodeMethodHandler類

  1. publicclassByteCodeClassHandlerextendsClassAdapter  
  2. {  
  3. publicByteCodeClassHandler(ClassVisitorcv)  
  4. {  
  5. super(cv);  
  6. }  
  7. publicvoidvisit(intversion,intaccess,Stringname,Stringsignature,  
  8. StringsuperName,String[]interfaces)  
  9. {  
  10. super.visit(version,access,name,signature,superName,interfaces);  
  11. }  
  12. publicvoidvisitSource(Stringsource,Stringdebug)  
  13. {  
  14. super.visitSource(source,debug);  
  15.  
  16. }  
  17. publicvoidvisitEnd()  
  18. {  
  19. }  
  20.  
  21. @Override  
  22.  
  23. publicMethodVisitorvisitMethod(intaccess,Stringname,Stringdesc,  
  24.  
  25. Stringsignature,String[]exceptions)  
  26. {  
  27. MethodVisitormv=cv.visitMethod(access,name,desc,signature,  
  28.  
  29. exceptions);  
  30.  
  31. MethodVisitorwrappedMv=mv;  
  32.  
  33. if(mv!=null)  
  34.  
  35. {  
  36.  
  37. //對于”helloHeyun”方法進行改造  
  38.  
  39. if(name.equals(“helloHeyun”))  
  40. {  
  41.  
  42. //使用自定義MethodVisitor,改寫方法內容  
  43.  
  44. wrappedMv=newByteCodeMethodHandler(mv);  
  45. }  
  46. }  
  47. returnwrappedMv;  
  48. }  
  49. }  
  50.  

 5.ByteCodeMethodHandler(自定義)繼承MethodAdapter(fromASM),這里來做改造想要調用的自定義方法,這里將調用類ControlByteCode(自定義)中的controlByteCodeByHeyun(自定義)方法

  1. publicclassByteCodeMethodHandlerextendsMethodAdapter  
  2. {  
  3. publicByteCodeMethodHandler(MethodVisitormv)  
  4. {  
  5. super(mv);  
  6. }  
  7. publicvoidvisitCode()  
  8. {  
  9. visitMethodInsn(Opcodes.INVOKESTATIC,“ControlByteCode”,  
  10.  
  11. “controlByteCodeByHeyun”,“()V”);  
  12. }  
  13. }  
  14.  

 6.ControlByteCode類的controlByteCodeByHeyun方法如下

  1. publicclassControlByteCode  
  2. {  
  3. publicstaticvoidcontrolByteCodeByHeyun()  
  4. {  
  5. System.out.println(“Thismethodhasalreadybeencovered.”);  
  6.  
  7. //TODOrealsecuritycheck  
  8. }  
  9. }  

7.這樣,當運行完Generator類中main方法后,會生成一個和原Java字節碼文件同名的文件(可以觀察出,會比以前的文件大,當然也可以用MD5來確定是兩個不同文件)。

8.此時在運行主方法類Main,會發現在Console打印如下:

  1. Hello,ThisisHeyun’sinvestigationaboutcodecoverage!  
  2.  
  3. Thismethodhasalreadybeencovered.  

9.由此,可以看出,在原功能沒有變化的前提下,通過改變Java字節碼文件,我們實現了CodeCoverage的雛形。實際上,很多CodeCoverage工具(如Cobertura)都是運用此方法來實現Instrument(插裝)的。

【編輯推薦】

  1. IBM發布Java字節碼配置工具包BIPTK
  2. 深入學習JVM內存設置原理和調優
  3. JVM.dll裝載過程與源代碼分析
  4. 巧解使Eclipse崩潰的JVM terminated問題
  5. 解決JVM Terminated.ExitCode=-1問題行之有效的方法


 

責任編輯:佚名 來源: qa.taobao.com
相關推薦

2019-12-20 12:38:28

Java技術工具

2011-12-01 14:56:30

Java字節碼

2023-03-27 16:44:23

2021-12-09 22:36:30

Java 字節碼頁緩存

2023-11-30 16:05:17

2019-10-30 08:45:21

JS代碼NodeJS

2009-12-16 11:04:51

Ruby操作文件權限

2023-07-03 08:11:48

java字節碼字段

2022-03-30 10:10:17

字節碼棧空間

2010-01-15 19:04:09

2009-12-10 15:41:35

PHP文件操作

2009-12-21 11:19:50

WCF配置文件

2010-07-20 10:48:56

Perl文件操作

2012-01-12 09:20:49

Java

2023-08-30 11:03:47

Java工具

2010-03-22 12:40:48

Python代碼加密

2009-12-16 10:49:42

Ruby操作二進制文件

2013-11-15 17:23:50

Linux技巧文件管理

2018-04-04 15:05:17

虛擬機字節碼引擎

2010-03-16 14:25:48

Linux操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一级黄色网 | 中文字幕第十一页 | 免费a国产 | 一区二区三区观看视频 | 毛片一区二区 | 亚洲欧美综合 | 亚洲黄色成人网 | 久久国产精品一区 | 国产精品久久二区 | 日韩久草| 欧美一级二级视频 | av一二三区| 青青草综合网 | 国产目拍亚洲精品99久久精品 | 亚洲精品黄色 | 日韩成人一区 | 国产精品夜夜夜一区二区三区尤 | 欧美a区 | 国产成人av免费看 | 久久亚洲欧美日韩精品专区 | 精品欧美一区二区中文字幕视频 | 超碰婷婷| 国产91网址 | 中文字幕精品一区二区三区精品 | 日韩福利在线 | 欧美一区二区久久 | 国产视频2021 | 久久99国产精品久久99果冻传媒 | 日韩不卡在线 | 涩爱av一区二区三区 | 成人乱人乱一区二区三区软件 | 亚洲一区二区免费 | 天天干天天爽 | 亚洲欧洲国产视频 | 亚洲草草视频 | 久久一久久 | 在线观看免费国产 | 国产激情91久久精品导航 | 久久久久久久综合 | 亚洲高清免费 | 精品国产一区二区在线 |