0%

java-asm前置知识

文章字数:737,阅读全文大约需要2分钟

一、jdk自带的javap工具

avap是JDK提供的一个命令行工具,javap能对给定的class文件提供的字节代码进行反编译。相对于jd, javap能够查看java编译器为我们生成的字节码,有利于程序调优。

使用方式:(命令行状态下)

1
2
javap <选项> <类名>
常用: javap -c -v 类名

部分常用命令(1.8)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-l  打印行和本地变量表
-public 只显示公共类和成员变量
-protected 只显示公共的、受保护的类和变量
-private 显示所有的类和成员变量
-p 显示所有的类和成员变量
-Joption 给jvm指定参数,例如:
javap -J-version
javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy
-s 打印内部类型签名(用于泛型)
-sysinfo 打印被处理类的系统信息(路径,大小,日志,md5哈希)
-constants 显示static final常量
-c 输出分解后的代码。例如,类中每一个方法内,包含java字节码的指令
-verbose 输出栈大小,变量(locals)和方法参数的个数
-classpath path 指定查询类的路径.如果设置该值,则会覆盖默认值和CLASSPATH环境变量。
-bootclasspath path 指定启动类的路径,默认值是jre/lib/rt.jar 和 其他少数的jar.
-extdir dirs 覆盖 java.ext.dirs路径

Fernflower.jar

批量反编译java字节码,idea使用的就是这种方法。、
使用

  • 首先把工程的所有class 压缩成zip
  • 执行命令
    1
    2
    # 二、java -jar fernflower.jar  <目标>.jar <文件夹名>/
    java -jar fernflower.jar classes.zip demo/

三、java.lang.instrument.Instrumentation

java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。
能够使加载的类与物理保存的.class文件不同,热部署的实现支持之一。常用于累的监控。
就是使用代理类,类加载前会执行代理类的指定方法处理字节码。

四、三种工具和asm的关系

  • asm是用来解析,保存,修改,创建二进制class文件的工具
  • javapFernflower.jar是反编译java class文件的工具,只是各有特点。
  • Instrumentation可以代理类,在加载前使用asm修改类。(JavaAgent java探针、代理)的实现

    Instrumentation可以编写代码使用javaagent代理执行其它java文件,在代码里使用上面的asm库动态修改代码。也可以直接将所有字节保存,并加载其它class文件。