/learn-java-asm

:bug: Java ASM

Primary LanguageJavaMIT LicenseMIT

Learn Java ASM

Gitee license Gitee stars Gitee forks Gitee issues Gitee last commit

Github GitHub GitHub stars GitHub forks GitHub issues GitHub last commit

๐Ÿ Java ASM is an open-source java library for manipulating bytecode.

ๆœฌ้กน็›ฎๆ—จๅœจ็ณป็ปŸๅœฐไป‹็ปๅฆ‚ไฝ•ๅญฆไน Java ASM็š„็Ÿฅ่ฏ†๏ผŒไธป่ฆๆถ‰ๅŠCore APIใ€OPCODEๅ’ŒTree API็ญ‰ๅ†…ๅฎนใ€‚่‡ณไบŽๅญฆไน ็š„้ข„ๆœŸ็›ฎๆ ‡ๅฐฑๆ˜ฏ๏ผŒ็”จไธ€ไธชๅฝข่ฑก็š„่ฏดๆณ•ๆฅ่ฎฒ๏ผŒ่ฎฉๅญ—่Š‚็ ๅœจไฝ ็š„ๆ‰‹ไธญโ€œ่ทณ่ˆžโ€๏ผš็œ‹็œ‹ไฝ ็š„ๅทฆๆ‰‹๏ผŒไธ€ไธชๅฎŒๆ•ด็š„ClassFileๆ‹†่งฃๆˆไธๅŒ็ฒ’ๅบฆ็š„ๅญ—่Š‚็ ๅ†…ๅฎน๏ผ›็œ‹็œ‹ไฝ ็š„ๅณๆ‰‹๏ผŒไธๅŒ็ฒ’ๅบฆ็š„ๅญ—่Š‚็ ๅ†…ๅฎนๅˆ้‡ๆ–ฐ็ป„็ป‡ๆˆไธ€ไธชClassFile็ป“ๆž„ใ€‚

ๅฆ‚ๆžœไฝ ่ง‰ๅพ—ไปฃ็ ่ฟ˜ไธ้”™๏ผˆ ๐Ÿ’– ๏ผ‰๏ผŒๆฌข่ฟŽๅŠ ๆ˜Ÿ๏ผˆ โญ ๏ผ‰ๆ”ฏๆŒ๏ผ

           _______                                 ,        _        _        
          (,     /'                              /'/      /' `\     ' )     _)
               /'                              /' /     /'   ._)    //  _/~/' 
             /'____ .     ,   ____          ,/'  /     (____      /'/_/~ /'   
   _       /'/'    )|    /  /'    )        /`--,/           )   /' /~  /'     
 /' `    /'/'    /' |  /' /'    /'       /'    /          /'  /'     /'       
(_____,/' (___,/(___|/(__(___,/(__   (,/'     (_,(_____,/'(,/'      (_,       

ๅฆ‚ๆžœๆˆ‘ไปฌๅญฆไผšไบ†Java ASMไน‹ๅŽ๏ผŒๅฏ่ƒฝ่ฟ˜ๆ˜ฏ้œ€่ฆไธ€ไธชๅ…ทไฝ“็š„ๅบ”็”จๅœบๆ™ฏๆฅ่ฟ›่กŒไฝฟ็”จ๏ผŒ่ฟ™ไธชๅœบๆ™ฏๅฐฑๆ˜ฏ็”ฑ Java Agent ๅผ€ๅฏ็š„ใ€‚

้‚ฃไนˆ๏ผŒJava ASMๅ’ŒJava Agent่ฟ™ไธค่€…ไน‹้—ดๆ˜ฏไป€ไนˆๅ…ณ็ณปๅ‘ข๏ผŸ Java ASMๆ˜ฏไธ€ไธชๆ“ไฝœๅญ—่Š‚็ ็š„ๅทฅๅ…ท๏ผˆtool๏ผ‰๏ผŒ่€ŒJava Agentๆไพ›ไบ†ไฟฎๆ”นๅญ—่Š‚็ ็š„ๆœบไผš๏ผˆopportunity๏ผ‰ใ€‚ ๆƒณๅƒ่ฟ™ๆ ทไธ€ไธชๅœบๆ™ฏ๏ผš ๆœ‰ไธ€ไธชJVMๆญฃๅœจ่ฟ่กŒ๏ผŒ็ช็„ถJava AgentๅœจJVMไธŠๆ‰“ๅผ€ไธ€ๆ‰‡ๅคง้—จ๏ผŒJava ASM้€š่ฟ‡ๅคง้—จๅ†ฒ่ฟ›JVM้‡Œ้ข๏ผŒๅฐฑ่ฆๅผ€ๅง‹ไฟฎๆ”นๅญ—่Š‚็ ไบ†ใ€‚

.class --- Java ASM --- Java Agent --- JVM

ๅ†ๆ‰“ไธชๆฏ”ๆ–น๏ผŒJava ASMๅฐฑๆ˜ฏโ€œไธ€ๅŒนๅƒ้‡Œ้ฉฌโ€๏ผŒ่€ŒJava Agentๅฐฑๆ˜ฏโ€œไผฏไนโ€ใ€‚ ๅฆ‚ๆžœ้‡ไธๅˆฐโ€œไผฏไนโ€๏ผŒๅฏ่ƒฝโ€œๅƒ้‡Œ้ฉฌโ€็š„ๆ‰่ƒฝๅฐฑๅŸ‹ๆฒกไบ†๏ผ›ๆญฃๅ› ไธบๆœ‰ไบ†โ€œไผฏไนโ€๏ผŒโ€œๅƒ้‡Œ้ฉฌโ€ๅฐฑๆœ‰ไบ†ๆ–ฝๅฑ•ๆ‰่ƒฝ็š„ๆœบไผšใ€‚

ไธ–ๆœ‰ไผฏไน๏ผŒ็„ถๅŽๆœ‰ๅƒ้‡Œ้ฉฌใ€‚
ๅƒ้‡Œ้ฉฌๅธธๆœ‰๏ผŒ่€Œไผฏไนไธๅธธๆœ‰ใ€‚
ๆ•…่™ฝๆœ‰ๅ้ฉฌ๏ผŒ็ฅ—่พฑไบŽๅฅด้šถไบบไน‹ๆ‰‹๏ผŒ้ชˆๆญปไบŽๆงฝๆžฅไน‹้—ด๏ผŒไธไปฅๅƒ้‡Œ็งฐไนŸใ€‚

1. ๅฆ‚ไฝ•ไฝฟ็”จ

1.1 ไปฃ็ ไธ‹่ฝฝ

Gitee Github

ไปŽGitee ไป“ๅบ“ไธ‹่ฝฝไปฃ็ ๏ผŒไฝฟ็”จๅฆ‚ไธ‹ๅ‘ฝไปค๏ผš

git clone https://gitee.com/lsieun/learn-java-asm

ไปŽGitHub ไป“ๅบ“ไธ‹่ฝฝไปฃ็ ๏ผŒไฝฟ็”จๅฆ‚ไธ‹ๅ‘ฝไปค๏ผš

git clone https://github.com/lsieun/learn-java-asm

1.2 ๅผ€ๅ‘็Žฏๅขƒ

Licence Git Java Apache Maven IntelliJ IDEA

ๅœจlearn-java-asm้กน็›ฎๅฝ“ไธญ๏ผŒไฝฟ็”จ็š„ASM็‰ˆๆœฌไธบ9.0ใ€‚ๅฆ‚ๆžœๆƒณไฝฟ็”จๆœ€ๆ–ฐMaven Central ็‰ˆๆœฌ๏ผŒๅฏไปฅไฟฎๆ”นpom.xmlๆ–‡ไปถไธญ็š„asm.versionๅฑžๆ€ง๏ผš

<asm.version>9.0</asm.version>

1.3. ่ฟ่กŒไปฃ็ 

ๅœจlearn-java-asm้กน็›ฎๅฝ“ไธญ๏ผŒๅŒ…ๅซmainๆ–นๆณ•็š„็ฑปไธป่ฆไฝไบŽrunๅŒ…๏ผˆsrc/main/java/run๏ผ‰ใ€‚

2. ่ฏพ็จ‹่ต„ๆ–™

51cto Bilibili lsieun.github.io

  • ใ€ŠJava ASM็ณปๅˆ—ไธ€๏ผšCore APIใ€‹
  • ใ€ŠJava ASM็ณปๅˆ—ไบŒ๏ผšOPCODEใ€‹
  • ใ€ŠJava ASM็ณปๅˆ—ไธ‰๏ผšTree APIใ€‹

2.1. ASM็š„็ป„ๆˆ้ƒจๅˆ†

ไปŽ็ป„ๆˆ็ป“ๆž„ไธŠๆฅ่ฏด๏ผŒJava ASMๆœ‰Core APIๅ’ŒTree APIไธค้ƒจๅˆ†็ป„ๆˆใ€‚

                                   โ”Œโ”€โ”€โ”€ asm.jar
                                   โ”‚
            โ”Œโ”€โ”€โ”€ Core API โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ asm-util.jar
            โ”‚                      โ”‚
            โ”‚                      โ””โ”€โ”€โ”€ asm-commons.jar
Java ASM โ”€โ”€โ”€โ”ค
            โ”‚
            โ”‚                      โ”Œโ”€โ”€โ”€ asm-tree.jar
            โ””โ”€โ”€โ”€ Tree API โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
                                   โ””โ”€โ”€โ”€ asm-analysis.jar

ไปŽไพ่ต–ๅ…ณ็ณป่ง’ๅบฆไธŠ่ฏด๏ผŒJava ASMๅฝ“ไธญ็š„ๅ„ไธช.jarไน‹้—ด็š„ไพ่ต–ๅ…ณ็ณปๅฆ‚ไธ‹๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”‚
โ”‚     util           โ”‚    analysis    โ”‚         commons    โ”‚
โ”‚             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚             โ”‚             tree             โ”‚             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                           core                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.2. ASM่ƒฝๅคŸๅšไป€ไนˆ

ไปŽๅบ”็”จ็š„่ง’ๅบฆๆฅ่ฏด๏ผŒJava ASMๅฏไปฅ่ฟ›่กŒClass Generationใ€Class Transformationๅ’ŒClass Analysisไธ‰ไธช็ฑปๅž‹็š„ๆ“ไฝœใ€‚

                                   โ”Œโ”€โ”€โ”€ find potential bugs
                                   โ”‚
            โ”Œโ”€โ”€โ”€ analysis โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ detect unused code
            โ”‚                      โ”‚
            โ”‚                      โ””โ”€โ”€โ”€ reverse engineer code
            โ”‚
Java ASM โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ generation
            โ”‚
            โ”‚                      โ”Œโ”€โ”€โ”€ optimize programs
            โ”‚                      โ”‚
            โ””โ”€โ”€โ”€ transformation โ”€โ”€โ”€โ”ผโ”€โ”€โ”€ obfuscate programs
                                   โ”‚
                                   โ””โ”€โ”€โ”€ insert performance monitoring code

2.3. top, nullๅ’Œvoid

ๅœจไธ‹่กจๅฝ“ไธญ๏ผŒtopใ€nullๅ’Œvoidไธ‰่€…็›ธๅฏนๅบ”็š„่ฝฌๆขๅ€ผ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   .class    โ”‚          ASM Type          โ”‚      ASM Value in Frame        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚     top     โ”‚            null            โ”‚ BasicValue.UNINITIALIZED_VALUE โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ aconst_null โ”‚ BasicInterpreter.NULL_TYPE โ”‚   BasicValue.REFERENCE_VALUE   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚    void     โ”‚       Type.VOID_TYPE       โ”‚              null              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3. ๆณจๆ„ไบ‹้กน

3.1. ๆทปๅŠ typoๅญ—ๅ…ธ

ๅœจ็ผ–ๅ†™ไปฃ็ ็š„่ฟ‡็จ‹ไธญ๏ผŒไผš้‡ๅˆฐไธ€ไบ›Typoๆ็คบ๏ผŒๅŽŸๅ› ๆ˜ฏinsn็ญ‰ๅ†…ๅฎนไธๆ˜ฏๅˆๆณ•็š„ๅ•่ฏใ€‚

่งฃๅ†ณๆ–นๆณ•๏ผšๅ€ŸๅŠฉไบŽIntelliJ IDEA็š„Spellchecking ็š„ๅŠŸ่ƒฝใ€‚

ๆ“ไฝœๆญฅ้ชค๏ผš

  • ็ฌฌไธ€ๆญฅ๏ผŒๅœจSettings/Preferencesๅฝ“ไธญ๏ผŒๆ‰พๅˆฐEditor | Natural Languages | Spellingไฝ็ฝฎใ€‚
  • ็ฌฌไบŒๆญฅ๏ผŒๅœจๅณไพง็š„Custom dictionariesไฝ็ฝฎ๏ผŒๆทปๅŠ custom dictionary๏ผŒๅœจlearn-java-asm้กน็›ฎๆ น็›ฎๅฝ•ไธ‹๏ผŒๆœ‰ไธ€ไธชaccepted-words.dicๆ–‡ไปถ๏ผŒๆทปๅŠ ่ฏฅๆ–‡ไปถๅณๅฏใ€‚

้…็ฝฎๅฎŒๆˆไน‹ๅŽ๏ผŒ้œ€่ฆ้‡ๆ–ฐๅฏๅŠจIntelliJ IDEAๆ‰่ƒฝ็”Ÿๆ•ˆใ€‚

3.2. ๆŸฅ็œ‹็ฌ”่ฎฐ

ๅœจ็ผ–ๅ†™ไปฃ็ ็š„่ฟ‡็จ‹ไธญ๏ผŒไธบไบ†ๆ–นไพฟ็†่งฃไปฃ็ ๏ผŒๆˆ‘ๆทปๅŠ ไบ†ไธ€ไบ›็ฌ”่ฎฐ๏ผŒๆ ผๅผๅฆ‚ไธ‹๏ผš

NOTE: ๅธŒๆœ›่ฟ™ๆ˜ฏไธ€ๆกๆœ‰็”จ็š„็ฌ”่ฎฐ

ไฝ†ๆ˜ฏ๏ผŒๅœจ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒๅฎƒๅนถไธไผš้ซ˜ไบฎๆ˜พ็คบ๏ผŒๅ› ๆญคไธๅฎนๆ˜“่ขซๅฏŸ่ง‰ๅˆฐใ€‚

่งฃๅ†ณๆ–นๆณ•๏ผšๅ€ŸๅŠฉไบŽIntelliJ IDEA็š„TODO comments ๅŠŸ่ƒฝใ€‚

ๆ“ไฝœๆญฅ้ชค๏ผš

  • ็ฌฌไธ€ๆญฅ๏ผŒๅœจSettings/Preferencesๅฝ“ไธญ๏ผŒๆ‰พๅˆฐEditor | TODOไฝ็ฝฎใ€‚
  • ็ฌฌไบŒๆญฅ๏ผŒๅœจๅณไพง็š„Patternsไฝ็ฝฎ๏ผŒๆทปๅŠ ไปฅไธ‹ๅ†…ๅฎน๏ผš
\bnote\b.*

้…็ฝฎๅฎŒๆˆไน‹ๅŽ๏ผŒ้œ€่ฆ้‡ๆ–ฐๅฏๅŠจIntelliJ IDEAๆ‰่ƒฝ็”Ÿๆ•ˆใ€‚

3.3. ๅ…ณ้—ญ่ฐƒ่ฏ•ไฟกๆฏ

ๅœจ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒ่ฟ่กŒไปปไฝ•็ฑป๏ผŒ้ƒฝไผš่พ“ๅ‡บ่ฐƒ่ฏ•ไฟกๆฏใ€‚ๅœจ่ฐƒ่ฏ•ไฟกๆฏไธญ๏ผŒไผšๅธฆๆœ‰[DEBUG]ๆ ‡่ฏ†ใ€‚

ๅฆ‚ๆžœๆƒณๅ…ณ้—ญ่ฐƒ่ฏ•ไฟกๆฏ๏ผŒๅฏไปฅไฟฎๆ”นlsieun.cst.Const็ฑป็š„DEBUGๅญ—ๆฎตๅ€ผไธบfalse๏ผˆ้ป˜่ฎคๅ€ผไธบtrue๏ผ‰๏ผš

public class Const {
    public static final boolean DEBUG = false;
}

็„ถๅŽ๏ผŒๆ‰ง่กŒmvn clean compileๅฏน็ฑป่ฟ›่กŒ้‡ๆ–ฐ็ผ–่ฏ‘๏ผš

mvn clean compile

็ญ‰ๅพ…็ผ–่ฏ‘ๅฎŒๆˆไน‹ๅŽ๏ผŒๅ†ๆฌก่ฟ่กŒ็จ‹ๅบใ€‚

4. ไบคๆตๅ้ฆˆ

  • ๅฆ‚ๆžœๆ‚จๆœ‰ๅฅฝ็š„ๆƒณๆณ•๏ผŒๅฏไปฅๆissues
  • ๅฆ‚ๆžœๆ‚จๆƒณ่ดก็Œฎไปฃ็ ๏ผŒๅฏไปฅ่ฟ›่กŒfork
  • ๅฆ‚ๆžœๆ‚จๆœ‰ๅ…ถๅฎƒ้—ฎ้ข˜๏ผŒๅฏไปฅๆทปๅŠ QQ็พค๏ผˆๅ‚่€ƒ่”็ณปๆ–นๅผ๏ผ‰

5. ่”็ณปๆ–นๅผ

wechat Tencent QQ QQ Group Javaๅญ—่Š‚็ ไบคๆตQQ็พค

6. License

This project is licensed under the MIT License. See the LICENSE file for the full license text.