欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年01月20日 16:29:41   作者:巴巴巴巴巴巴掌  
這篇文章主要給大家介紹了關于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關資料,文中通過示例代碼介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。

之前我們已經(jīng)對ASM進行的詳細的介紹,需要的朋友們可以點擊這里:java字節(jié)碼框架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方法是

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

對應的類型簽名就是

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

再比如,java方法是

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

那對應的類型簽名就是

hi (DLjava/util/List;)V

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

public class Test {

 public static void main(String[] args) throws Exception {
 ClassPrinter printer = new ClassPrinter();
 //讀取靜態(tài)內部類Bazhang
 ClassReader cr = new ClassReader("Test$Bazhang");
 cr.accept(printer, 0);

 }

 //靜態(tà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);
 }
 }

}

最后打印出來的內容:

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

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

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

public void newFunc(String str){
 
}

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

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:

//
// 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直接操作字節(jié)碼也是沒問題的,結尾附上ASM源碼下載地址http://forge.ow2.org/projects/asm/

總結

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

相關文章

  • SpringBoot+Redis+Lua分布式限流的實現(xiàn)

    SpringBoot+Redis+Lua分布式限流的實現(xiàn)

    本文主要介紹了SpringBoot+Redis+Lua分布式限流的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 解決問題:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    解決問題:Failed to execute goal org.apache.m

    這篇文章主要給大家介紹了關于解決問題:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources的相關資料,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Java實現(xiàn)二維碼、條形碼功能(案例代碼)

    Java實現(xiàn)二維碼、條形碼功能(案例代碼)

    ZXing是一個開放源碼的,用Java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫,它包含了聯(lián)系到其他語言的端口,Zxing可以實現(xiàn)使用手機的內置的攝像頭完成條形碼的掃描及解碼,這篇文章主要介紹了Java實現(xiàn)二維碼、條形碼等功能,需要的朋友可以參考下
    2024-01-01
  • java 學習筆記(入門篇)_程序流程控制結構和方法

    java 學習筆記(入門篇)_程序流程控制結構和方法

    程序流程控制結構分為:順序、選擇、循環(huán)以及異常處理結構,語句是程序的基本組成單位,一般來說語句的執(zhí)行流程是按順序來進行的,但是當遇到一些特殊的條件,比如循環(huán),這時候語句就會按照流程控制結構來進行了
    2013-01-01
  • java實現(xiàn)簡單銀行ATM系統(tǒng)

    java實現(xiàn)簡單銀行ATM系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 你一定不知道的Java Unsafe用法詳解

    你一定不知道的Java Unsafe用法詳解

    Unsafe是位于sun.misc包下的一個類,主要提供一些用于執(zhí)行低級別、不安全操作的方法,如直接訪問系統(tǒng)內存資源、自主管理內存資源等,下面這篇文章主要給大家介紹了關于Java Unsafe用法的相關資料,需要的朋友可以參考下
    2021-10-10
  • Feign調用傳輸文件異常的解決

    Feign調用傳輸文件異常的解決

    這篇文章主要介紹了Feign調用傳輸文件異常的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java 中運行字符串表達式的方法

    Java 中運行字符串表達式的方法

    這篇文章主要介紹了Java 中運行字符串表達式的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Java Lambda表達式詳解

    Java Lambda表達式詳解

    這篇文章主要介紹了Java Lambda表達式詳解,包括了Java Lambda表達式創(chuàng)建線程,Java Lambda表達式的語法,Java lambda遍歷List集合,Java lambda過濾String需要的朋友可以參考下
    2023-02-02
  • Java反射機制,如何將一個實體類所有字段賦值為null

    Java反射機制,如何將一個實體類所有字段賦值為null

    這篇文章主要介紹了Java反射機制,如何將一個實體類所有字段賦值為null,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論