侧边栏壁纸
博主头像
丛庆

没事儿写代码,有事写代码。email:1024@cong.zone

  • 累计撰写 116 篇文章
  • 累计创建 97 个标签
  • 累计收到 4 条评论

【Java】【Maven】用IDEA开发一个java agent

丛庆
2022-11-19 / 0 评论 / 0 点赞 / 503 阅读 / 395 字 / 正在检测是否收录...
温馨提示:
部分资料和图片来源于网络,如有危害到您的利益请与我联系删除,1024@cong.zone。

创建一个空工程
image-1668864007808

创建一个agent-demo子模块
image-1668864026416

image-1668864170052

在pom文件中增加打包插件
注意修改<Premain-Class><Agent-Class>的值

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifestEntries>
                            <Premain-Class>zone.cong.Agent</Premain-Class>
                            <Agent-Class>zone.cong.Agent</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>attached</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

编写代理类,输出每个类的classname

package zone.cong;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

public class LogAgent implements ClassFileTransformer {
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        System.out.println("agent -> " + className);
        return classfileBuffer;
    }
}

编写代理类

package zone.cong;

import java.lang.instrument.Instrumentation;

public class Agent {
    /**
     * jvm 参数形式启动,运行此方法
     */
    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new LogAgent());
        System.out.println("premain");
    }
}

可以点击maven的按钮进行打包
image-1668874524960

生成的jar包
image-1668874559974

在idea中或者启动的时候配置agent参数
-javaagent:<jar包地址>

-javaagent:D:\workspace\agent-demo\agent-log\agent-log\target\agent-log-1.0-SNAPSHOT-jar-with-dependencies.jar

或者在java启动时增加该参数

jave -javaagent:<jar包地址> -jar <需要启动的jar包>

一个入门的agent开发完成
image-1668875280115

0

评论区