青年IT男

个人从事金融行业,就职过易极付、思建科技等重庆一流技术团队,目前就职于某网约车平台负责整个支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、人工智能等领域。

Java agent简单实用

Java agent简单实用

在日常开发中我们可能有这样的需求,比如在不修改代码情况下对应用程序方法调用时间监控、日志打印等等。我们可以使用开源的必然cat、pinpoint等等,如果我们需要自定义实现的话这里就需要用到java中的agent
至于agent的定义读者可以参考其他文章,这里直接上荔枝。

定义Agent类:

agent入口

public static void premain(String agentOps, Instrumentation inst) {
        System.out.println("=========premain方法执行========");
        System.out.println(agentOps);
        // 添加Transformer
        inst.addTransformer(new FirstAgent());

    }

Transformer实现

public class FirstAgent implements ClassFileTransformer {
    public final String injectedClassName = "com.huwo.component.agent.DemoTest";
    public final String methodName = "hello";

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        className = className.replace("/", ".");
        System.out.println(className);
        if (className.equals(injectedClassName)) {
            System.out.println(className);
            CtClass ctclass = null;
            try {
                ctclass = ClassPool.getDefault().get(className);// 使用全称,用于取得字节码类<使用javassist>
                CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);
                System.out.println("methodName = " + ctmethod);
//                CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);// 得到这方法实例
                ctmethod.insertBefore("System.out.println(11111111);");
                return ctclass.toBytecode();
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
        return null;
    }

测试

public class DemoTest {
    public static void main(String[] args) {
        System.out.println("start main");
        hello();
    }
    public static void hello(){

    }
}

依赖添加

使用maven

       <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>${javassist.version}</version>
        </dependency>
0
1028826685@qq.com