一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

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

java字節碼框架ASM操作字節碼的方法淺析

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

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

之前我們已經對ASM進行的詳細的介紹,需要的朋友們可以點擊這里:java字節碼框架ASM的深入學習

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);

對應的類型簽名就是

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

再比如,java方法是

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

那對應的類型簽名就是

?
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();
 //讀取靜態內部類Bazhang
 ClassReader cr = new ClassReader("Test$Bazhang");
 cr.accept(printer, 0);
 
 }
 
 //靜態內部類
 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);
 }
 }
 
}

最后打印出來的內容:

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

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

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

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

這個時候就需要用到ClassWriter了,用于拼接字節碼,具體關于ClassReader、ClassVisitor、ClassWriter的文章可以查看這篇文章:ASM源碼學習之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文件對應的二進制流
 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) {
 }
}

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

總結

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久性生大片免费观看性 | 小早川怜子亚洲综合中文字幕 | 天天综合五月天 | 操bb| 九九热视频 这里有精品 | 精品视频久久久久 | 男人把j放进女人的p里视频 | 91九色视频无限观看免费 | 亚洲大逼| 亚洲国产五月综合网 | 99热久久这里只有精品6国产网 | 美女在线看永久免费网址 | 精品无人区乱码1区2区3区免费 | 日本在线视频网址 | 久久99亚洲AV无码四区碰碰 | 爱情岛论坛亚洲永久入口口 | 翁熄性放纵交换300章 | 国产99在线 | 日本在线视频免费看 | 9420高清视频在线观看网百度 | 2018天天弄 | 亚洲国产精品第一页 | 亚洲精品一二区 | 99热这里只有精品在线播放 | 成人在线视频国产 | 九九九国产视频 | 99视频全部免费 | 免费国产一级 | 激情小视频 | 激情艳妇 | 特色特色大片在线 | 日本xxx片免费高清在线 | 亚洲精品国产成人中文 | 日本精品一二三区 | 成人伊人青草久久综合网破解版 | 色婷婷天天综合在线 | www.av网站| 鸥美毛片| 欧美一二 | 日本中出视频 | www.在线观看视频 |