📓 Archive

  • Pricing
  • Chess
  • Syntax
  • JAVAAGENT

    FGJ: Create:2023/12/26 Update: [2024-12-03]

    • Intro(JavaAgent) #

      通过实现agent类中的premain方法将自定义的类转换器注册到JVM中,从而实现类加载之前对字节码进行处理。本次实验中对类未进行处理,而是在加载类之前打印输出。
      完整代码可 参考

      • 代码实现 #

        package agent;
        
        import java.lang.instrument.ClassFileTransformer;
        import java.lang.instrument.Instrumentation;
        
        public class MyAgent {
            public static void premain(String args, Instrumentation instrumentation){
                ClassFileTransformer classFileTransformer = new MyTransfor();
                instrumentation.addTransformer(classFileTransformer);
            }
        }
        
        package agent;
        
        import java.lang.instrument.ClassFileTransformer;
        import java.lang.instrument.IllegalClassFormatException;
        import java.security.ProtectionDomain;
        
        public class MyTransfor implements ClassFileTransformer {
            @Override
            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        
                /*_12302_2019-07-26_<此处可以静态代理>*/
                System.out.println("from: " + className + "--> hello agent!");
        
                /*_12302_2019-07-26_<return null 并不表示将要加载的类清空,而是不往其中添加任何东西>*/
                return null;
            }
        }
        
        package demo;
        
        public class TestMain {
            public static void main(String[] args) {
                System.out.println("this is _base.base.demo.TestMain.main(),and nothing else");
            }
        }
        
      • 构建及运行 #

        使用maven-assembly-plugin插件进行构建的。在assembly.xml配置中排除主类包,并在pom.xmlassembly插件配置中定义了生成META-INF/MANIFEST.MF文件且包含Premain-Class: agent.MyAgent 属性。

        # 进入JTW主目录
        cd _6_un_JTW
        
        # 构建agent,因为pom.xml文件中定义的 assembly.single 绑定声明周期为package。所以需要package处理。
        mvn -Dmaven.test.skip=true clean package
        
        # 查看jar文件列表
        jar -tf target/agent/custom-agent-1.0-SNAPSHOT.jar
        
        # 提取并检查`META-INF/MANIFEST.MF`中是否存在`Premain-Class: agent.MyAgent` 
        jar xf target/agent/custom-agent-1.0-SNAPSHOT.jar  META-INF/MANIFEST.MF
        
        # 运行TestMain主类查看效果
        java -cp target/classes  -javaagent:target/agent/custom-agent-1.0-SNAPSHOT.jar demo.TestMain
        

    Reference #


    comments powered by Disqus