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

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

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

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

JVM的類(lèi)型簽名對(duì)照表

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

對(duì)應(yīng)的類(lèi)型簽名就是

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

再比如,java方法是

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

那對(duì)應(yīng)的類(lèi)型簽名就是

hi (DLjava/util/List;)V

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

public class Test {

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

 }

 //靜態(tài)內(nèi)部類(lè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);
  //打印出父類(lèi)name和本類(lèi)name
  System.out.println(superName + " " + name);
 }

 @Override
 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
  //打印出方法名和類(lèi)型簽名
  System.out.println(name + " " + desc);
  return super.visitMethod(access, name, desc, signature, exceptions);
 }
 }

}

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

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

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

那么接下來(lái)干點(diǎn)有意思的事,我們往Bazhang類(lèi)里新增和方法,就定為:

public void newFunc(String str){
 
}

這個(gè)時(shí)候就需要用到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文件對(duì)應(yīng)的二進(jìn)制流
 byte[] code = cw.toByteArray();
 
 //將二進(jìn)制流寫(xiě)到out/下
 FileOutputStream fos = new FileOutputStream("out/Bazhang222.class");
 fos.write(code);
 fos.close();

}

這樣就會(huì)在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é)碼也是沒(méi)問(wèn)題的,結(jié)尾附上ASM源碼下載地址http://forge.ow2.org/projects/asm/

總結(jié)

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

相關(guān)文章

  • github上的java項(xiàng)目怎么運(yùn)行(面向小白)

    github上的java項(xiàng)目怎么運(yùn)行(面向小白)

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

    Java中的IO讀寫(xiě)原理詳解

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

    詳解java中通過(guò)post方式訪(fǎng)問(wèn)后臺(tái)服務(wù)器

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

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

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

    SpringBoot整合Freemarker的基本步驟

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

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

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

    詳解Java生成PDF文檔方法

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

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

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

    SpringBoot中如何解決讀取properties文件讀取問(wèn)題

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

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

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

最新評(píng)論

天水市| 柯坪县| 邻水| 兴隆县| 方正县| 达拉特旗| 武穴市| 万州区| 安吉县| 连云港市| 谷城县| 通山县| 杭锦后旗| 涞水县| 佛学| 盘山县| 庆阳市| 富阳市| 措美县| 宾阳县| 西乌珠穆沁旗| 昌吉市| 民县| 西峡县| 冀州市| 且末县| 玉林市| 连城县| 河北区| 化州市| 溧阳市| 平凉市| 长兴县| 罗田县| 蒲城县| 南皮县| 塔河县| 连城县| 武宣县| 右玉县| 周宁县|