标签分类
技术文章
当前位置:主页 > 计算机编程 > java > java agent用法实例

java agent用法及实例代码

  • 发布时间:
  • 作者:码农之家原创
  • 点击:126

java agent用法实例

这篇文章主要知识点是关于java,agent,用法,实例,代码,java agent用法实例,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java核心技术卷II:高级特性
  • 类型:Java大小:195.7 MB格式:PDF出版:机械工业出版社作者:霍斯特曼
立即下载
Java开发实例大全(提高卷)
  • 类型:Java编程大小:162.8 MB格式:PDF出版:清华大学出版社作者:软件开发技术联盟
立即下载

更多相关的学习资源可以参阅 程序设计电子书Java电子书Java视频、等栏目。

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 使用及实现代码

总结

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

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到等java文章进一步学习,感谢大家的阅读和支持。

上一篇:java关于腾讯ocr图片识别接口调用总结

下一篇:Spring借助Redis设计访问计数器实例讲解

展开 +

收起 -

学习笔记
网友NO.487350

Java中File文件操作类的基础用法

前言 众所周知Java提供File类,让我们对文件进行操作,下面就来简单整理了一下File类的用法。 话不多说了,来一起看看详细的介绍吧 1.基本概念 File:文件和目录路径名的抽象表示形式,代表文件或者文件夹。 2.构造方法 // 根据parent抽象路径名和child路径名字符串创建一个新File实例 File(File parent, String child) // 通过将给定路径名字符串转换为抽象路径名来创建一个新File实例 File(String pathname) // 根据parent路径名字符串和child路径名字符串创建一个新File实例 File(String parent, String child) // 通过将给定的file:URI转换为一个抽象路径名来创建一个新的File实例 File(URI uri) 3.常用方法 (1).创建功能 // 创建此抽象路径名指定的目录 boolean mkdir() // 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录 boolean mkdirs() // 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件 boolean createNewFile() // 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称 static File createTempFile(String prefix, String suffix) // 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称 static File createTempFile(String prefix, String suffix, File directory) // 构造方法一 File file1 = new File("f://file1"); // 构造方法二 File file2 = ……

网友NO.543490

Java函数习惯用法详解

在Java编程中,有些知识 并不能仅通过语言规范或者标准API文档就能学到的。在本文中,我会尽量收集一些最常用的习惯用法,特别是很难猜到的用法。 我把本文的所有代码都放在公共场所里。你可以根据自己的喜好去复制和修改任意的代码片段,不需要任何的凭证。 实现equals() class Person { String name; int birthYear; byte[] raw; public boolean equals(Object obj) { if (!obj instanceof Person) return false; Person other = (Person)obj; return name.equals(other.name) birthYear == other.birthYear Arrays.equals(raw, other.raw); } public int hashCode() { ... }} 参数必须是Object类型,不能是外围类。 foo.equals(null) 必须返回false,不能抛NullPointerException。(注意,null instanceof 任意类 总是返回false,因此上面的代码可以运行。) 基本类型域(比如,int)的比较使用 == ,基本类型数组域的比较使用Arrays.equals()。 覆盖equals()时,记得要相应地覆盖 hashCode(),与 equals() 保持一致。 参考: java.lang.Object.equals(Object)。 实现hashCode() class Person { String a; Object b; byte c; int[] d; public int hashCode() { return a.hashCode() + b.hashCode() + c + Arrays.hashCode(d); } public boolean equals(Object o) { ... }} 当x和y两个对象具有x.equals(y) == true ,你必须要确保x.hashCode() == y.hashCode()。 根据逆反命题,如果x.hashCode() != y.hashCode(),那么x.equals(y) == false 必定……

网友NO.202694

Java锁机制Lock用法示例

本文实例讲述了Java锁机制Lock用法。分享给大家供大家参考,具体如下: package com.expgiga.JUC;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 一、用于解决多线程安全问题的方式: * 1.同步代码块 synchronized 隐式锁 * 2.同步方法 synchronized 隐式锁 * 3.同步锁Lock (jdk1.5以后) 显示锁 * 注意:显示锁,需要通过lock()方式上锁,必须通过unlock()方式进行释放锁 */public class TestLock { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread(ticket, "1号窗口").start(); new Thread(ticket, "2号窗口").start(); new Thread(ticket, "3号窗口").start(); }}class Ticket implements Runnable { private int tick = 100; private Lock lock = new ReentrantLock(); @Override public void run() { while (true) { lock.lock(); try { if (tick 0) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 完成售票,余票为 " + --tick); } } finally { lock.unlock(); } } }} 运行结果: 1号窗口 完成售票,余票为 99 2号窗口 完成售票,余票为 98 2号窗口 完成售票,余票为 97 2号窗口 完成售票,余票为 96 2号窗口 完成售票,余票为 95 3号窗口 完成售票,余票为 94 1号窗口 完成售票,余票为 93 1号窗口 完成售票,余票为 92 1号窗口 完成售票,余票为 91 1号窗口 完成售票,余票……

网友NO.969375

JAVA Optional类用法分享

Optional在JAVA中被定义为一个容器类,更确切的说只存一个元素的容器。 container object which may or may not contain a non-null value. Optional类结构 Optional属性 Optional类中包含两个属性: 类属性:EMPTY 对象属性:value EMPTY属性用来存放一个value为null的Optional对象。 value属性用来存放非null对象。 Optional方法 Optional的有两个构造方法,都被private修饰。 private Optional() { this.value = null;}private Optional(T value) { this.value = Objects.requireNonNull(value);} 无参构造方法用来初始化EMPTY。有参构造方法用来初始化非null对象。 因为构造方法被修饰为私有的,Optional想要实例化对象只能通过类方法调用。Optional提供三个类方法。 empty:返回value为null的Optional对象 of:返回value非null的Optional对象 ofNullable:value的值根据参数是否为null返回对应的Optional对象 public staticT OptionalT empty() { OptionalT t = (OptionalT) EMPTY; return t;}public static T OptionalT of(T value) { return new Optional(value);}public static T OptionalT ofNullable(T value) { return value == null ? empty() : of(value);} 实例方法介绍 方法 参数类型 返回类型 说明 get 无 T value为null抛出NoSuchElementException异常 isPresent 无 boolean value为null则返回false ifPresent Consumer? super T void 如果Optional实例有值则为其调用consumer,否则不做处理 filter Predicate? super T OptionalT 如果值存在……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明