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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值