美文网首页
java探针示例

java探针示例

作者: 行走的鸡汤哥 | 来源:发表于2019-12-29 22:19 被阅读0次

入口类

import com.yrx.agent.transformer.TraceTransformer;

import java.lang.instrument.Instrumentation;

/**
 * Created by r.x on 2019/10/22.
 */
public class TraceAgent {

    public static void premain(String option, Instrumentation ins) {
        ins.addTransformer(new TraceTransformer());
    }

    public static void main(String[] args) {

    }
}

字节码处理

import javassist.*;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

/**
 * Created by r.x on 2019/10/22.
 */
public class TraceTransformer implements ClassFileTransformer {

    /** 遍历类名和方法名 start */
    /*@Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        if (className.startsWith("com/yrx/datasourcemanager/manager/api")) {
            System.out.println("class name:{" + className + "}");
            // System.out.println(new String(classfileBuffer));
        } else {
            return null;
        }
        ClassReader reader = null;
        reader = new ClassReader(classfileBuffer);
        System.out.println("reader ----->" + reader);
        System.out.println("reader ----->" + reader.getClassName());
        ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
        System.out.println("writer ----->" + writer);
        ClassVisitor visitor = new ClassVisitor(Opcodes.ASM5, writer) {
            @Override
            public MethodVisitor visitMethod(int i, String name, String response, String responseSignature, String[] strings) {
                System.out.println("method name s:{" + name + "}");
                System.out.println("method name s1:{" + response + "}");
                System.out.println("method name s2:{" + responseSignature + "}");
                return super.visitMethod(i, name, response, responseSignature, strings);
            }

        };

        //忽略调试信息
        reader.accept(visitor, ClassReader.SKIP_DEBUG);
        return null;
    }*/
    /** 遍历类名和方法名 end */

    private byte[] addAop(String className, String methodName) {
        String currentMethodStr = "System.out.println(\"Thread.currentThread().getStackTrace()[1].getMethodName() = \" + Thread.currentThread().getStackTrace()[1].getMethodName());";
        ClassPool cp = ClassPool.getDefault();
        try {
            CtClass ctClass = cp.get(className);
            CtMethod declaredMethod = ctClass.getDeclaredMethod(methodName);
            declaredMethod.insertBefore(currentMethodStr);


            return ctClass.toBytecode();
        } catch (NotFoundException | CannotCompileException | IOException e) {
            System.out.println("==================== add aop error ! ====================");
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        // todo 需要剔除接口
        if (className.startsWith("com/yrx/datasourcemanager/manager/") && !className.contains("$")) {
            ClassPool pool = new ClassPool(true);
            pool.appendClassPath(new LoaderClassPath(loader));
            try {
                CtClass cls = pool.makeClass(new ByteArrayInputStream(classfileBuffer));

                CtMethod[] methods = cls.getDeclaredMethods();
                for (CtMethod method : methods) {
                    //插入本地变量
                    method.addLocalVariable("startTime", CtClass.longType);
                    String codeStrBefore = "startTime=System.currentTimeMillis();";
                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.append("System.out.println(\"thread:[\"+Thread.currentThread().getName()+\"]")
                            .append("method:[" + className + "." + method.getName() + "] time cost [\"").append(" + (System.currentTimeMillis() - startTime) + \"]millisecond\");");

                    String codeStrAfter = stringBuilder.toString();
                    System.out.println(codeStrBefore);
                    System.out.println(codeStrAfter);
                    method.insertBefore(codeStrBefore);
                    method.insertAfter(codeStrAfter);
                }

                File file = new File("E:\\software\\intelliJ IDEA\\project\\manager\\agent\\src\\com\\yrx\\agent\\demo\\", cls.getSimpleName() + ".class");
                try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
                    fileOutputStream.write(cls.toBytecode());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return cls.toBytecode();
            } catch (Exception e) {
                System.out.println(" ========= add aop error ========= className:" + className);
                e.printStackTrace();
            }
        }
        return null;
    }
}

执行

java -javaagent:./out/artifacts/agent_jar/agent.jar -jar ./target/manager-0.0.1-SNAPSHOT.jar

相关文章

  • java探针示例

    入口类 字节码处理 执行

  • 06.kubernetes笔记 Pod探针与多容器

    目录 Pod生命周期 探针探针配置规范示例1:通过cmd命令探测存活示例2:tcp 端口探测示例3:http存活探...

  • 22 skyWalking 客户端配置

    java Agent 服务器探针参考官网给出的帮助 Setup java agent,我们需要使用官方提供的探针...

  • Spring Cloud 整合 SkyWalking

    Java Agent 服务器探针 探针,用来收集和发送数据到归集器。参考官网给出的帮助 Setup java ag...

  • java 探针

    关于java agent这里只是做一个 简单的介绍,因为详细的介绍官网上有很多地址:https://www.ibm...

  • java实现文件复制、剪切、删除、过滤书目录

    java实现文件复制示例 java实现剪切文件示例 java实现删除文件示例 java实现过滤文件示例

  • JAVA基础教程书目录

    使用Java示例计算圆形区域 使用Java示例计算圆周 使用Java示例计算矩形区域 使用Java示例计算矩形周长...

  • -javaagent

    Java探针-Java Agent技术 在利用JetbrainsCrack对IDEA进行破解的时候有用到如下-ja...

  • Java - agent探针

    Java - agent探针 介绍 使用 Instrumentation,使得开发者可以构建一个独立于应用程序的代...

  • Java探针(javaagent)

    JDK1.5开始引入了Agent机制(即启动java程序时添加“-javaagent”参数,Java Agent机...

网友评论

      本文标题:java探针示例

      本文链接:https://www.haomeiwen.com/subject/rzpuoctx.html