首頁  >  文章  >  Java  >  java字節碼框架ASM操作字節碼的方法淺析

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

高洛峰
高洛峰原創
2017-01-23 10:23:511737瀏覽

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

JVM的類型簽名對照表

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

比如,java方法是

reee

對應的型別簽字就是

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

再比如,java方法是

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

那對應的型別簽字就是接下來要核對ASMreee

那對應的型別簽字是用來驗證兩個

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

   

最後列印出來的內容:

hi (DLjava/util/List;)V

驗證了先前的正確性,其中可以看到預設構造函數也印出來了。

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

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

這個時候就需要用到ClassWriter了,用於拼接字節碼,具體關於ClassReader、 ClassVisitor、ClassWriter的文章可以查看這篇文章:ASM源碼學習之ClassReader、ClassVisitor與ClassWriter詳解

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

   

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

總結

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

更多java字節碼框架ASM操作字節碼的方法淺析相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn