中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

OpenJDK 里的 AsmTools 簡(jiǎn)介

2018-07-28    來源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

前言

  • https://wiki.openjdk.java.net/display/CodeTools/asmtools

在OpenJDK里有一個(gè)AsmTools項(xiàng)目,用來生成正確的或者不正確的java?.class文件,主要用來測(cè)試和驗(yàn)證。

我們知道直接修改.class文件是很麻煩的,雖然有一些圖形界面的工具,但還是很麻煩。

以前我的辦法是用ASMifier從.class文件生成asm java代碼,再修改代碼,生成新的.class文件,非常麻煩。

AsmTools引入了兩種表示.class文件的語(yǔ)法:

  • JASM

    用類似java本身的語(yǔ)法來定義類和函數(shù),字節(jié)碼指令則很像傳統(tǒng)的匯編。

  • JCOD

    整個(gè).class用容器的方式來表示,可以很清楚表示類文件的結(jié)構(gòu)。

重要的是兩種語(yǔ)法的文件都是可以和.class互相轉(zhuǎn)換的。

構(gòu)建AsmTools

官方文檔:?https://wiki.openjdk.java.net/display/CodeTools/How+to+build+AsmTools

需要有jdk8和ant。

clone代碼

hg clone http://hg.openjdk.java.net/code-tools/asmtools

編繹

cd asmtools/build
ant

打包出來的zip包里有一個(gè)asmtools.jar。

也可以在這里下載我構(gòu)建的:https://github.com/hengyunabc/hengyunabc.github.io/files/2188258/asmtools-7.0.zip

測(cè)試簡(jiǎn)單的java類

public class Test {
	public static void main(String[] args) {
		System.out.println("hello");
	}
}

先用javac來編繹:

javac Test.java

查看JASM語(yǔ)法結(jié)果

java -jar asmtools.jar jdis Test.class

結(jié)果:

super public class Test
	version 52:0
{


public Method "<init>":"()V"
	stack 1 locals 1
{
		aload_0;
		invokespecial	Method java/lang/Object."<init>":"()V";
		return;

}

public static Method main:"([Ljava/lang/String;)V"
	stack 2 locals 1
{
		getstatic	Field java/lang/System.out:"Ljava/io/PrintStream;";
		ldc	String "hello";
		invokevirtual	Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
		return;

}

} // end Class Test

查看JCOD語(yǔ)法結(jié)果

java -jar asmtools.jar jdec Test.class

結(jié)果:

class Test {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    class #2; // #1
    Utf8 "Test"; // #2
    class #4; // #3
    Utf8 "java/lang/Object"; // #4
    Utf8 "<init>"; // #5
    Utf8 "()V"; // #6
    Utf8 "Code"; // #7
    Method #3 #9; // #8
    NameAndType #5 #6; // #9
    Utf8 "LineNumberTable"; // #10
    Utf8 "LocalVariableTable"; // #11
    Utf8 "this"; // #12
    Utf8 "LTest;"; // #13
    Utf8 "main"; // #14
    Utf8 "([Ljava/lang/String;)V"; // #15
    Field #17 #19; // #16
    class #18; // #17
    Utf8 "java/lang/System"; // #18
    NameAndType #20 #21; // #19
    Utf8 "out"; // #20
    Utf8 "Ljava/io/PrintStream;"; // #21
    String #23; // #22
    Utf8 "hello"; // #23
    Method #25 #27; // #24
    class #26; // #25
    Utf8 "java/io/PrintStream"; // #26
    NameAndType #28 #29; // #27
    Utf8 "println"; // #28
    Utf8 "(Ljava/lang/String;)V"; // #29
    Utf8 "args"; // #30
    Utf8 "[Ljava/lang/String;"; // #31
    Utf8 "SourceFile"; // #32
    Utf8 "Test.java"; // #33
  } // Constant Pool

  0x0021; // access
  #1;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #5; // name_cpx
      #6; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70008B1;
          }
          [] { // Traps
          } // end Traps
          [] { // Attributes
            Attr(#10) { // LineNumberTable
              [] { // LineNumberTable
                0  2;
              }
            } // end LineNumberTable
            ;
            Attr(#11) { // LocalVariableTable
              [] { // LocalVariableTable
                0 5 12 13 0;
              }
            } // end LocalVariableTable
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          2; // max_stack
          1; // max_locals
          Bytes[]{
            0xB200101216B60018;
            0xB1;
          }
          [] { // Traps
          } // end Traps
          [] { // Attributes
            Attr(#10) { // LineNumberTable
              [] { // LineNumberTable
                0  5;
                8  6;
              }
            } // end LineNumberTable
            ;
            Attr(#11) { // LocalVariableTable
              [] { // LocalVariableTable
                0 9 30 31 0;
              }
            } // end LocalVariableTable
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#32) { // SourceFile
      #33;
    } // end SourceFile
  } // Attributes
} // end class Test

從JASM/JCOD語(yǔ)法文件生成類文件

因?yàn)槭堑葍r(jià)表達(dá),可以從JASM生成.class文件:

java -jar asmtools.jar jasm Test.jasm

同樣可以從JCOD生成.class文件:

java -jar asmtools.jar jcoder Test.jasm

更多使用方法參考:?https://wiki.openjdk.java.net/display/CodeTools/Chapter+2#Chapter2-Jasm.1

鏈接

  • https://wiki.openjdk.java.net/display/CodeTools/Appendix+A?JASM Syntax
  • https://wiki.openjdk.java.net/display/CodeTools/Appendix+B?JCOD Syntax

標(biāo)簽: isp 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Linux 中如何通過設(shè)備號(hào)找到設(shè)備

下一篇:Java虛擬機(jī)(JVM)概述