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.bcjava bytecode探索