当前位置: 首页 > news >正文

javassit(1) 基础概念

通过javassit操作类,是各种链路追踪系统最基本的知识。通过java agent机制实现代码不侵入的监控性能,实现主动监控,主动告警,代码时间消耗记录等等...

核心类

ClassPool:map结构 key为类名 value为CtClass

CtClass:拿到对应的操作类对象

CtField:构造类字段

CtMethod:操作方法,能赋到CtClass上 成为一个新方法

CtConstructor:操作构造方法 赋值到CtClass 成为一个新的构造方法

实践

生成class文件

ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("demo.generate.GenerateHello");
// 构造接口
ctClass.setInterfaces(new CtClass[]{pool.makeInterface("java.lang.Cloneable")});
// 构造字段
CtField ctField = new CtField(CtClass.intType, "id", ctClass);
ctField.setModifiers(AccessFlag.PUBLIC);

// 类上增加字段
ctClass.addField(ctField);

// 增加构造函数
CtConstructor constructor = CtNewConstructor.make("public GenerateHello(int pid) {this.id=pid;}", ctClass);
ctClass.addConstructor(constructor);

// 增加方法
CtMethod ctMethod = CtNewMethod.make("public void hello(String desc){System.out.println(desc);}", ctClass);
ctClass.addMethod(ctMethod);

ctClass.writeFile();
Field[] fields = ctClass.toClass().getFields();
System.out.println("属性名称: " + fields[0].getName() + "属性类型: " + fields[0].getType());

生成对应的class文件,通过idea进入查看

package demo.generate;

public class GenerateHello implements Cloneable {
    public int id;

    public GenerateHello(int var1) {
        this.id = var1;
    }

    public void hello(String var1) {
        System.out.println(var1);
    }
}

修改java文件

Point

package demo.extend;

/**
 * @author chenhao.ych
 * @date 2019-07-15
 */
public class Point {

    private int x;

    private int y;

    public Point() {
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void move(int dx, int dy) {
        this.x += dx;
        this.y += dy;
    }
}

修改文件

 public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    ClassPool classPool = ClassPool.getDefault();

    CtClass ctClass = classPool.get("demo.extend.Point");
    CtMethod method = ctClass.getDeclaredMethod("move");
    method.insertBefore("{System.out.print(\"dx:\" + $1);System.out.println(\"dy: \" + $2);}");
    method.insertAfter("{System.out.println(this.x);System.out.println(this.y);}");

    ctClass.writeFile();

    Class clazz = ctClass.toClass();

    Method move = clazz.getMethod("move", new Class[]{int.class, int.class});
    Constructor constructor = clazz.getConstructor(new Class[]{int.class, int.class});

    move.invoke(constructor.newInstance(1, 2), 1, 2);

}

修改后的class文件反编译

package demo.extend;

public class Point {
    private int x;
    private int y;

    public Point() {
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void move(int dx, int dy) {
        System.out.print("dx:" + dx);
        System.out.println("dy: " + dy);
        this.x += dx;
        this.y += dy;
        Object var4 = null;
        System.out.println(this.x);
        System.out.println(this.y);
    }
}





转载于:https://www.cnblogs.com/adroit/p/11192491.html

相关文章:

  • unity中Playable的使用
  • 设计已死?
  • 镜花缘——李汝珍著
  • 破译肢体语言密码——王邈著
  • 探寻胡适的精神世界——欧阳哲生著
  • 新开通一个英文博客
  • 大宋国士——陈启文著
  • 爸爸是只“狗”——王小列著
  • 从项目中清楚ClickOnce
  • 极限运算法则
  • [VS2005 Tip] 自动生成Property。
  • 函数的连续性
  • 心态造就一生——张现杰著
  • 辐射幽灵 前苏联核试验场纪实照片
  • 函数的间断点
  • git 常用命令
  • Java小白进阶笔记(3)-初级面向对象
  • PhantomJS 安装
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 从输入URL到页面加载发生了什么
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 将回调地狱按在地上摩擦的Promise
  • 经典排序算法及其 Java 实现
  • 详解移动APP与web APP的区别
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)创业的注意事项
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net项目IIS、VS 附加进程调试
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Bean, @Component, @Configuration简析
  • @ConditionalOnProperty注解使用说明
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ABC294Ex] K-Coloring
  • [Angular 基础] - 指令(directives)
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [Asp.net mvc]国际化
  • [BUG] Authentication Error
  • [C#]C#学习笔记-CIL和动态程序集
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [CTSC2014]企鹅QQ
  • [hdu2196]Computer树的直径