激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析

java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析

2020-07-30 15:25巴巴巴巴巴巴掌 Java教程

這篇文章主要給大家介紹了關(guān)于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。

之前我們已經(jīng)對ASM進行的詳細的介紹,需要的朋友們可以點擊這里:java字節(jié)碼框架ASM的深入學(xué)習(xí)

JVM的類型簽名對照表

 

Type Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class ;fully-qualified-class
[ type type[]
( arg-types ) ret-type method type

 

比如,java方法是

?
1
long f (int n, String s, int[] arr);

對應(yīng)的類型簽名就是

?
1
f (ILjava/lang/String;[I)J

再比如,java方法是

?
1
private void hi(double a, List<String> b);

那對應(yīng)的類型簽名就是

?
1
hi (DLjava/util/List;)V

接下來可以利用ASM進行驗證上述兩個類型簽名是否正確:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Test {
 
 public static void main(String[] args) throws Exception {
 ClassPrinter printer = new ClassPrinter();
 //讀取靜態(tài)內(nèi)部類Bazhang
 ClassReader cr = new ClassReader("Test$Bazhang");
 cr.accept(printer, 0);
 
 }
 
 //靜態(tài)內(nèi)部類
 static class Bazhang {
 
 public Bazhang(int a) {
 }
 
 private long f (int n, String s, int[] arr){
  return 0;
 }
 
 private void hi(double a, List<String> b){
 
 }
 }
 
 static class ClassPrinter extends ClassVisitor {
 
 public ClassPrinter() {
  super(Opcodes.ASM5);
 }
 
 @Override
 public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
  super.visit(version, access, name, signature, superName, interfaces);
  //打印出父類name和本類name
  System.out.println(superName + " " + name);
 }
 
 @Override
 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
  //打印出方法名和類型簽名
  System.out.println(name + " " + desc);
  return super.visitMethod(access, name, desc, signature, exceptions);
 }
 }
 
}

最后打印出來的內(nèi)容:

?
1
2
3
4
java/lang/Object Test$Bazhang
<init> ()V
f (ILjava/lang/String;[I)J
hi (DLjava/util/List;)V

驗證了之前的正確性,其中可以看到默認構(gòu)造函數(shù)也打印出來了。

那么接下來干點有意思的事,我們往Bazhang類里新增和方法,就定為:

?
1
2
3
public void newFunc(String str){
 
}

這個時候就需要用到ClassWriter了,用于拼接字節(jié)碼,具體關(guān)于ClassReader、ClassVisitor、ClassWriter的文章可以查看這篇文章:ASM源碼學(xué)習(xí)之ClassReader、ClassVisitor與ClassWriter詳解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) throws Exception {
 ClassReader cr = new ClassReader(Bazhang.class.getName());
 ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
 
 cr.accept(cw, Opcodes.ASM5);
 
 MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "newFunc", "(Ljava/lang/String;)V", null, null);
 
 mv.visitInsn(Opcodes.RETURN);
 mv.visitEnd();
 
 // 獲取生成的class文件對應(yīng)的二進制流
 byte[] code = cw.toByteArray();
 
 //將二進制流寫到out/下
 FileOutputStream fos = new FileOutputStream("out/Bazhang222.class");
 fos.write(code);
 fos.close();
 
}

這樣就會在out/文件夾下生成Bazhang222.class:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
 
import java.util.List;
 
class Test$Bazhang {
 Test$Bazhang() {
 }
 
 private long f(int n, String s, int[] arr) {
 return 0L;
 }
 
 private void hi(double a, List<String> b) {
 }
 
 public void newFunc(String var1) {
 }
}

結(jié)合之前整理的JVM指令集,使用ASM直接操作字節(jié)碼也是沒問題的,結(jié)尾附上ASM源碼下載地址http://forge.ow2.org/projects/asm/

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

原文鏈接:http://www.wangyuwei.me/2017/01/20/ASM-操作字節(jié)碼初探/?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本精品久久久一区二区三区 | 国产精品热 | 得得啪在线视频 | 黄色片的网站 | 国产美女三级做爰 | 三级国产三级在线 | 久艹在线视频 | 一区二区三区精品国产 | 最新久久免费视频 | 在线免费观看毛片 | a黄在线观看 | 在线观看中文字幕国产 | 亚洲精品午夜在线 | 亚洲午夜视频 | 亚洲欧美日韩久久精品第一区 | 狠狠干网站 | 高清做爰免费无遮网站挡 | 圆产精品久久久久久久久久久 | 欧美成人午夜 | aaaaaaa毛片| 国产妞干网 | 在线a毛片 | 亚洲电影免费观看国语版 | 一边吃奶一边摸下娇喘 | 在线免费黄色网 | 国产精品毛片无码 | 成人午夜精品久久久久久久蜜臀 | 毛片免费在线播放 | 玖草| 黄色羞羞视频在线观看 | 999久久国产 | 日本在线不卡一区二区 | 欧美日韩一区三区 | 成人免费观看在线视频 | 在线亚洲播放 | 97久久精品一区二区三区观看 | 欧美日韩精品不卡一区二区三区 | 成人18在线| 免费永久看羞羞片网站入口 | 欧美在线a | 欧美自拍 |