java agent 使用及实现代码

 更新时间:2018年07月26日 10:20:59   作者:木木甫  
java agent的作用可以在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要给大家讲解java agent 使用及实现代码,感兴趣的朋友一起看看吧

java agent的作用

在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。可以理解spring的aop技术

如何实现

1.实现javaagent需要实现premain方法
2.必须在MANIFEST.MF文件中有Premain-Class

demo实现

agent
 package com.xueyou.demo.agent;
  import javassist.ClassPool;
  import javassist.CtClass;
  import javassist.CtMethod;
  import javassist.CtNewMethod;
  import java.lang.instrument.ClassFileTransformer;
  import java.lang.instrument.IllegalClassFormatException;
  import java.security.ProtectionDomain;
  public class FirstAgent implements ClassFileTransformer {
    public final String injectedClassName = "com.xueyou.agentdemo.App";
    public final String methodName = "hello";
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
      className = className.replace("/", ".");
  //    System.out.println(className);
      if (className.equals(injectedClassName)) {
        CtClass ctclass = null;
        try {
          ctclass = ClassPool.getDefault().get(className);// 使用全称,用于取得字节码类<使用javassist>
          CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);// 得到这方法实例
          ctmethod.insertBefore("System.out.println(11111111);");
          return ctclass.toBytecode();
        } catch (Exception e) {
          System.out.println(e.getMessage());
          e.printStackTrace();
        }
      }
      return null;
    }
  }

预加载类

package com.xueyou.demo;
import com.xueyou.demo.agent.FirstAgent;
import java.lang.instrument.Instrumentation;
/**
 * Hello world!
 */
public class App {
  public static void premain(String agentOps, Instrumentation inst) {
    System.out.println("=========premain方法执行========");
    System.out.println(agentOps);
    // 添加Transformer
    inst.addTransformer(new FirstAgent());
  }
}

maven指定预加载类

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>utf-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer
                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <manifestEntries>
                    <PremainClass>com.xueyou.demo.App</Premain-Class>
                  </manifestEntries>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

如何使用

这里有两种方式指定javaagent:

1)使用命令行:java -javaagent:XXX.jar ddd.jar
2)使用idea的vm option选项。

总结

以上所述是小编给大家介绍的java agent 使用及实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Spring中的自定义NamespaceHandler详解

    Spring中的自定义NamespaceHandler详解

    这篇文章主要介绍了Spring中的自定义NamespaceHandler详解,通常情况下,Spring生态圈提供的功能已足够使用,但不排除特殊情况下,需要匹配特殊及复杂的业务情况,Spring提供了可扩展Schema支持,可以自定义命名空间进行配置及解析,需要的朋友可以参考下
    2023-11-11
  • Java Socket通信介绍及可能遇到的问题解决

    Java Socket通信介绍及可能遇到的问题解决

    最近在学习Java中的Socket通信,所以下面这篇文章主要给大家介绍了关于Java Socket通信介绍及可能遇到问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
    2017-10-10
  • java文字转语音的实现示例

    java文字转语音的实现示例

    在Java中,我们可以使用第三方库来实现文字转语音的功能,本文主要介绍了java文字转语音的实现示例,选择jacob技术实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • springboot之联表查询方式

    springboot之联表查询方式

    这篇文章主要介绍了springboot之联表查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java通过Callable和Future来接收线程池的执行结果

    java通过Callable和Future来接收线程池的执行结果

    这篇文章主要介绍了java通过Callable和Future来接收线程池的执行结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring Boot如何通过自定义注解实现日志打印详解

    Spring Boot如何通过自定义注解实现日志打印详解

    这篇文章主要给大家介绍了关于Spring Boot如何通过自定义注解实现日志打印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 基于JavaMail的Java实现复杂邮件发送功能

    基于JavaMail的Java实现复杂邮件发送功能

    这篇文章主要为大家详细介绍了基于JavaMail的Java实现复杂邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • SWT(JFace) 简易浏览器 制作实现代码

    SWT(JFace) 简易浏览器 制作实现代码

    SWT(JFace) 简易浏览器 制作实现代码
    2009-06-06
  • IntelliJ IDEA中程序包org.slf4j找不到的解决

    IntelliJ IDEA中程序包org.slf4j找不到的解决

    这篇文章主要介绍了IntelliJ IDEA中程序包org.slf4j找不到的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java中super关键字的用法和细节

    Java中super关键字的用法和细节

    大家好,本篇文章主要讲的是Java中super关键字的用法和细节,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论