JavaAgent介绍 | 基本介绍及无侵入打印方法耗时

闲聊

最近在配置skywalking的过程中发现了-javaagent:这个配置,这里做一个简单的学习

什么是JavaAgent

网上似乎没有直接的文档介绍这个,只找了instrument包的相关文档,其内容页。其中的内容也都是介绍javaagent相关。

instrument包下核心就是字节码增强,此包下有2个核心接口ClassFileTransformerInstrumentation

  • ClassFileTransformer:An agent provides an implementation of this interface in order to transform class files.

  • ClassFileTransformer:代理需要实现这个接口,并对class文件转化(增强)

  • Instrumentation:This class provides services needed to instrument Java programming language code.

  • Instrumentation:Instrumentation 为代码增强提供了必要的服务和功能。

有什么用及怎么用

有什么用

代码增强可以用于监控代理、分析器、覆盖分析器和事件记录器。

怎么用

上面介绍了这么多编码过程,如果想要能使用,则需要打成jar包,具体使用需要通过-javaagent来让代码运行。总算知道为啥没有文档了,-javaagent主要是用来让代理生效的,核心是instrument包

如果伴随jar包启动,需要创建premain方法,并在MANIFEST.MF中指定Premain-Class: com.mountain.monk.MyAgent

如果是在启动后,再进行代理,则需要创建agentmain方法,并在MANIFEST.MF中指定Agent-Class: com.mountain.monk.MyAgent

实现一个计算函数执行时间的功能

  1. 随便创建一个类,创建premain方法,此处我使用了javassist来生成字节码
java 复制代码
public class MyAgent {

    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new TimeTransformer(),true);

    }



    public static class TimeTransformer implements ClassFileTransformer {


        @Override
        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            // 这里我们限制下,只针对目标包下进行耗时统计
            if (!className.startsWith("com/mountain/monk/")) {
                return classfileBuffer;
            }

            CtClass cl = null;
            try {
                ClassPool classPool = ClassPool.getDefault();

                cl = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));


                for (CtMethod method : cl.getDeclaredMethods()) {
                    method.addLocalVariable("start", CtClass.longType);
                    method.insertBefore("start = System.currentTimeMillis(); ");
                    method.insertAfter("System.out.println(\"「monk」methodName:" + method.getName() + ", cost: \" + (System" +
                            ".currentTimeMillis() - start));");
                }

                return cl.toBytecode();
            } catch (Exception e) {
                System.err.println("Error transforming class: " + className);

                e.printStackTrace();
            }
            return classfileBuffer;

        }
    }
}
  1. 创建MANIFEST.MF,注意最后要空一行
java 复制代码
Premain-Class: com.mountain.monk.MyAgent
Can-Redefine-Calsses: true
Can-Retransform-Classes: true
  1. 配置maven,注意:我这里需要把依赖打包进去
maven 复制代码
<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>
  1. 配置Idea启动参数

-javaagent:/Users/chenhui/learn/monk_note/self_agent/target/self_agent-1.0-SNAPSHOT-jar-with-dependencies.jar

  1. 随便找一个代码启动
相关推荐
救救孩子把14 分钟前
深入理解 Java 对象的内存布局
java
落落落sss17 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
万物皆字节23 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭29 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由36 分钟前
速成java记录(上)
java·速成
一直学习永不止步42 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明42 分钟前
面试知识储备-多线程
java·面试·职场和发展
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
煸橙干儿~~1 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
2401_854391081 小时前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端