java bytecode探索
ByteBuddy:生成和操作Class文件的library
Class<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.method(ElementMatchers.named("toString"))
.intercept(FixedValue.value("Hello World!))
.make()
.load(getClass().getClassLoader())
.getLoaded();
assertThat(dynamicType.newInstance().toString, is("Hello World!"));
// 默认ByteBuddy配置使用最新的class版本创建java类;继承了Object并且覆盖toString方法, toString方法返回字符串常量"Hello World"
// 预定义的元素匹配器named(String),ByteBuddy提供了很多定义并测试号的匹配器,收集在ElelmentMatchers类文件中;
// FixedValue类定义了常量返回值;实现Implemetation接口
// Java指令API
(1) import java.lang.instrument.Instrumentation;
class Example{
public static void premain(String args, Instrumentation inst) {
//TODO
}
}
(2) 新建manifest文件manifest.txt,标记类为可执行
Premain-Class: Example
(3) 编译类,将class文件和manifest.txt打包
javac Example.java
jar cmf manifest.txt yourAwesomeAgent.jar *.class
(4) 使用-javaagent参数执行JVM
java -javaagent:yourAwesomeAgent.jar -jar yourApp.jar
// 学习bytecode语法的好处:可用于所有java支持的平台,bytecode比本地机器代码更容易;所有的指令都已经文档化
// javac Hello.java // 生成bytecode代码
// javap -c Hello > Hello.bc