Skip to content

Instantly share code, notes, and snippets.

@wutingjia
Created October 19, 2019 11:33
Show Gist options
  • Save wutingjia/adebb0682c14802dcb734dfa9e9fff87 to your computer and use it in GitHub Desktop.
Save wutingjia/adebb0682c14802dcb734dfa9e9fff87 to your computer and use it in GitHub Desktop.
javaagent

javaagent

核心接口:ClassFileTransformer

public class MyClassTransformer implements ClassFileTransformer {

    /*实现ClassFileTransformer接口中的唯一方法。
     *用于对类的转换,每加载一个类都会调用这个函数。
     * classfileBuffer 是这个类的二进制形式,即所说的操作字节码就是操作这个字节数组。
     */
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        System.out.println("开始修改类" + className);
        return classfileBuffer;
    }

}

然后需要一个核心方法类似main,可以在任意名字的一个类中

public class Premain {

    /*
     * 这个方法将在main函数被加载前执行。
     * 通过addTransformer 加入 ClassFileTransformer的实现类。
     * 方法签名不能变
     */
    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new MyClassTransformer());
    }
}

打成jar包,将premain函数所在类指定为<Premain-Class>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Premain-Class>com.wutj.demo.Premain</Premain-Class>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

在需要这个agent的java程序的jvm参数中添加: -javaagent:{agentjar位置}

更多参考https://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment