最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

之前我們已經(jīng)對ASM進(jìn)行的詳細(xì)的介紹,需要的朋友們可以點擊這里: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方法是

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

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

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

再比如,java方法是

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

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

hi (DLjava/util/List;)V

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

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)容:

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

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

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

public void newFunc(String str){
 
}

這個時候就需要用到ClassWriter了,用于拼接字節(jié)碼,具體關(guān)于ClassReader、ClassVisitor、ClassWriter的文章可以查看這篇文章:ASM源碼學(xué)習(xí)之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文件對應(yīng)的二進(jìn)制流
 byte[] code = cw.toByteArray();
 
 //將二進(jìn)制流寫到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) {
 }
}

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

總結(jié)

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

相關(guān)文章

  • github上的java項目怎么運行(面向小白)

    github上的java項目怎么運行(面向小白)

    這篇文章主要介紹了github上的java項目怎么運行(面向小白),今天從github把我以前寫的一個小demo下載下來了,第一次下載項目,摸索了一個多小時,才運行起來,需要的朋友可以參考下
    2019-06-06
  • Java中的IO讀寫原理詳解

    Java中的IO讀寫原理詳解

    這篇文章主要介紹了Java中的IO讀寫原理,IO是指輸入和輸出操作的技術(shù),它提供了一組用于讀取和寫入數(shù)據(jù)的類,以及用于處理字符和字節(jié)數(shù)據(jù)的接口,這些類和接口可以用于讀取和寫入文件、網(wǎng)絡(luò)流、內(nèi)存緩沖區(qū)等各種數(shù)據(jù)源和目標(biāo),需要的朋友可以參考下
    2023-08-08
  • 詳解java中通過post方式訪問后臺服務(wù)器

    詳解java中通過post方式訪問后臺服務(wù)器

    本篇文章主要介紹了詳解java中通過post方式訪問后臺服務(wù)器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java如何確定兩個區(qū)間范圍是否有交集

    Java如何確定兩個區(qū)間范圍是否有交集

    這篇文章主要介紹了Java如何確定兩個區(qū)間范圍是否有交集問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot整合Freemarker的基本步驟

    SpringBoot整合Freemarker的基本步驟

    這篇文章主要介紹了SpringBoot整合Freemarker的基本步驟,添加依賴及添加相關(guān)配置的實例代碼詳解,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • JAVA中使用FileWriter寫數(shù)據(jù)到文本文件步驟詳解

    JAVA中使用FileWriter寫數(shù)據(jù)到文本文件步驟詳解

    這篇文章主要介紹了JAVA中使用FileWriter寫數(shù)據(jù)到文本文件步驟詳解,FileWriter類提供了多種寫入字符的方法,包括寫入單個字符、寫入字符數(shù)組和寫入字符串等,它還提供了一些其他的方法,如刷新緩沖區(qū)、關(guān)閉文件等,需要的朋友可以參考下
    2023-10-10
  • 詳解Java生成PDF文檔方法

    詳解Java生成PDF文檔方法

    這篇文章主要介紹了Java生成PDF文檔方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java垃圾回收機(jī)制簡述

    Java垃圾回收機(jī)制簡述

    這篇文章主要為大家詳細(xì)介紹了Java垃圾回收機(jī)制的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot中如何解決讀取properties文件讀取問題

    SpringBoot中如何解決讀取properties文件讀取問題

    這篇文章主要介紹了SpringBoot中如何解決讀取properties文件讀取問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java Socket編程實例(四)- NIO TCP實踐

    Java Socket編程實例(四)- NIO TCP實踐

    這篇文章主要講解Java Socket編程中NIO TCP的實例,希望能給大家做一個參考。
    2016-06-06

最新評論

古浪县| 汝城县| 千阳县| 蒙自县| 黔东| 南京市| 云林县| 漠河县| 舞钢市| 五大连池市| 青阳县| 九江县| 奉贤区| 平泉县| 江口县| 黎川县| 南京市| 香格里拉县| 蒲江县| 乌兰浩特市| 江阴市| 丹棱县| 沛县| 开阳县| 枣强县| 鹤山市| 板桥市| 平远县| 土默特左旗| 巫溪县| 阿克苏市| 蓬安县| 陇西县| 义乌市| 湘乡市| 改则县| 太保市| 宜兰市| 迁安市| 北辰区| 二连浩特市|