欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java agent 使用及實(shí)現(xiàn)代碼

 更新時(shí)間:2018年07月26日 10:20:59   作者:木木甫  
java agent的作用可以在字節(jié)碼這個(gè)層面對(duì)類(lèi)和方法進(jìn)行修改的技術(shù),能夠在不影響編譯的情況下,修改字節(jié)碼。本文主要給大家講解java agent 使用及實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧

java agent的作用

在字節(jié)碼這個(gè)層面對(duì)類(lèi)和方法進(jìn)行修改的技術(shù),能夠在不影響編譯的情況下,修改字節(jié)碼??梢岳斫鈙pring的aop技術(shù)

如何實(shí)現(xiàn)

1.實(shí)現(xiàn)javaagent需要實(shí)現(xiàn)premain方法
2.必須在MANIFEST.MF文件中有Premain-Class

demo實(shí)現(xiàn)

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);// 使用全稱(chēng),用于取得字節(jié)碼類(lèi)<使用javassist>
          CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);// 得到這方法實(shí)例
          ctmethod.insertBefore("System.out.println(11111111);");
          return ctclass.toBytecode();
        } catch (Exception e) {
          System.out.println(e.getMessage());
          e.printStackTrace();
        }
      }
      return null;
    }
  }

預(yù)加載類(lèi)

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方法執(zhí)行========");
    System.out.println(agentOps);
    // 添加Transformer
    inst.addTransformer(new FirstAgent());
  }
}

maven指定預(yù)加載類(lèi)

<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選項(xiàng)。

總結(jié)

以上所述是小編給大家介紹的java agent 使用及實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java中的邏輯結(jié)構(gòu)詳解

    Java中的邏輯結(jié)構(gòu)詳解

    這篇文章主要介紹了Java中的邏輯結(jié)構(gòu)詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Spring?Cloud?Eureka(全面解析)?大白話

    Spring?Cloud?Eureka(全面解析)?大白話

    這篇文章主要介紹了Spring?Cloud?Eureka(全面解析)?大白話,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Springboot整合Mybatis和SQLite的詳細(xì)過(guò)程

    Springboot整合Mybatis和SQLite的詳細(xì)過(guò)程

    這篇文章主要介紹了Springboot整合Mybatis和SQLite的詳細(xì)過(guò)程,本文通過(guò)圖文示例相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能

    使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能

    什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機(jī)制的Web 開(kāi)發(fā)框架.下面通過(guò)本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能,需要的朋友參考下吧
    2018-01-01
  • Java文件寫(xiě)入器FileWriter使用指南

    Java文件寫(xiě)入器FileWriter使用指南

    在Java中,FileWriter類(lèi)用于將字符寫(xiě)入文件中,它繼承了Writer類(lèi),因此可以使用Writer類(lèi)中的所有方法,下面我們就來(lái)深入探討一下FileWriter類(lèi)的使用方法吧
    2023-10-10
  • IntelliJ IDEA中Scala、sbt、maven配置教程

    IntelliJ IDEA中Scala、sbt、maven配置教程

    這篇文章主要介紹了IntelliJ IDEA中Scala、sbt、maven配置教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java解析多層嵌套json字符串問(wèn)題

    java解析多層嵌套json字符串問(wèn)題

    這篇文章主要介紹了java解析多層嵌套json字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • swagger文檔增強(qiáng)工具knife4j使用圖文詳解

    swagger文檔增強(qiáng)工具knife4j使用圖文詳解

    這篇文章主要介紹了swagger文檔增強(qiáng)工具knife4j使用詳解,想要使用knife4j非常簡(jiǎn)單,只要在Springboot項(xiàng)目中引入knife4j的依賴(lài)即可,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • java地理坐標(biāo)系及投影間轉(zhuǎn)換代碼示例

    java地理坐標(biāo)系及投影間轉(zhuǎn)換代碼示例

    在地圖投影中,經(jīng)常需要將坐標(biāo)從不同的坐標(biāo)系之間進(jìn)行轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于java地理坐標(biāo)系及投影間轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Springboot微服務(wù)打包Docker鏡像流程解析

    Springboot微服務(wù)打包Docker鏡像流程解析

    這篇文章主要介紹了Springboot微服務(wù)打包Docker鏡像流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論