最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?agent的入門與demo演示詳解

 更新時間:2023年05月26日 10:00:49   作者:weihubeats  
Java?Agent?是?Java?1.5?版本之后引?的特性,其主要作?是在class被加載之前對其攔截,這篇文章主要介紹了agent的簡單使用,需要的可以參考下

背景

繼之前我們研究了下skywalking是什么以及skywalking如何監(jiān)控skywalking

我們并沒有探討過多的skywalking原理 實際上skywalking的實現(xiàn)原理就是javaagent所以我們再繼續(xù)研究skywalking之前還是先補補基礎(chǔ)吧

什么是java 的agent

Java Agent 是 Java 1.5 版本之后引?的特性,其主要作?是在class被加載之前對其攔截,已插?我們的監(jiān)聽字節(jié)碼

官方文檔: https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#whatIs

用通俗易懂的話來說就是,我們可以不改變原有項目的任何代碼,對項目進行一些增強操作

agent的加載時機

Java的Agent加載時機分別有兩處

  • 加載時刻增強(JVM 啟動時加載)
  • 動態(tài)增強(JVM 運行時加載)

我們要如何進行編碼來實現(xiàn)我們的增強邏輯呢? JVM提供了幾個入口函數(shù)

加載時刻增強(JVM 啟動時加載)

JVM 啟動時加載啟動時的入口方法提供了兩個

?//?方法一
public?static?void?premain(String?agentArgs,?Instrumentation?inst);
//?方法二
public?static?void?premain(String?agentArgs);

這兩個函數(shù)的優(yōu)先級是,如果沒有方法一,則尋找方法二

動態(tài)增強(JVM 運行時加載)

JVM 運行時加載也提供了兩個入口方法

//?方法一
public?static?void?agentmain(String?agentArgs,?Instrumentation?inst);
//?方法二
public?static?void?agentmain(String?agentArgs);

與上面JVM 啟動時加載的加載機制一樣。如果沒有方法一,則尋找方法二

如果剛接觸agent大家可能還是有點懵 沒關(guān)系,下面我們先帶大家寫一個簡單的demo來看看效果,這樣就更容易理解

demo演示

如果不想編寫我這里也提供了直接下載的源碼

源碼地址:https://github.com/weihubeats/weihubeats_demos/tree/master/java-demos/agent-demo

項目結(jié)構(gòu)

核心demo

package?com.weihubeats.agent.demo;

import?java.lang.instrument.Instrumentation;

public?class?AgentDemo?{


????public?static?void?premain(String?agentArgs,?Instrumentation?inst)?{
????????System.out.println("=========?小奏技術(shù)1?premain?init?========");
????????System.out.println("agentArgs:="+agentArgs);

????}
????
????public?static?void?premain(String?agentArgs)?{
????????System.out.println("=========?小奏技術(shù)2?premain?agentArgs?init?========");
????????System.out.println("agentArgs:="+agentArgs);
????}
????
}

注意我們寫完代碼之后需要創(chuàng)建一個resources/META-INF.MANIFEST.MF文件

文件內(nèi)容如下

Manifest-Version: 1.0
Can-Redefine-Classes: true   # true表示能重定義此代理所需的類,默認值為 false(可選)
Can-Retransform-Classes: true    # true 表示能重轉(zhuǎn)換此代理所需的類,默認值為 false (可選)
Premain-Class:  com.weihubeats.agent.demo.AgentDemo

這樣我們的代碼就編寫完成了。這時候我們需要將整個項目打成一個jar,然后給其他項目接入

需要注意如果我們要測試agentmain的使用,需要手動調(diào)用觸發(fā)

import?com.sun.tools.attach.VirtualMachine;

public?class?Main?{

??public?static?void?main(String[]?args)?{
????//?獲取當(dāng)前?Java?進程的?PID
????String?pid?=?ManagementFactory.getRuntimeMXBean().getName().split("@")[0];?
????
????//?使用運行中的?JVM?PID?創(chuàng)建一個?VirtualMachine?對象
????VirtualMachine?vm?=?VirtualMachine.attach(pid);
????
????//?加載并附加?Java?Agent?到運行中的?JVM
????vm.loadAgent("path/to/your/agent.jar");
????
????//?現(xiàn)在?agentmain?方法應(yīng)該已經(jīng)被調(diào)用了
??}
}

從這里可以看到agentmain的增強方式觸發(fā)有點麻煩,所以我們就暫>時不演示這種觸發(fā)方式了 skywalking的實現(xiàn)也是基于premain去實現(xiàn)的

打包

pom添加打包插件

<build>
????????<finalName>java-agent-demo</finalName>
????????<plugins>
????????????<plugin>
????????????????<artifactId>maven-shade-plugin</artifactId>
????????????????<executions>
????????????????????<execution>
????????????????????????<phase>package</phase>
????????????????????????<goals>
????????????????????????????<goal>shade</goal>
????????????????????????</goals>
????????????????????????<configuration>
????????????????????????????<shadedArtifactAttached>false</shadedArtifactAttached>
????????????????????????????<createDependencyReducedPom>true</createDependencyReducedPom>
????????????????????????????<createSourcesJar>true</createSourcesJar>
????????????????????????????<shadeSourcesContent>true</shadeSourcesContent>
????????????????????????????<transformers>
????????????????????????????????<transformer
????????????????????????????????????implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
????????????????????????????????????<manifestEntries>
????????????????????????????????????????<Premain-Class>com.weihubeats.agent.demo.AgentDemo</Premain-Class>
????????????????????????????????????????<Can-Redefine-Classes>true</Can-Redefine-Classes>
????????????????????????????????????????<Can-Retransform-Classes>true</Can-Retransform-Classes>
????????????????????????????????????</manifestEntries>
????????????????????????????????</transformer>
????????????????????????????</transformers>
????????????????????????????<!--<artifactSet>
????????????????????????????????<excludes>
????????????????????????????????????<exclude>*:gson</exclude>
????????????????????????????????????<exclude>io.netty:*</exclude>
????????????????????????????????????<exclude>io.opencensus:*</exclude>
????????????????????????????????????<exclude>com.google.*:*</exclude>
????????????????????????????????????<exclude>com.google.guava:guava</exclude>
????????????????????????????????????<exclude>org.checkerframework:checker-compat-qual</exclude>
????????????????????????????????????<exclude>org.codehaus.mojo:animal-sniffer-annotations</exclude>
????????????????????????????????????<exclude>io.perfmark:*</exclude>
????????????????????????????????????<exclude>org.slf4j:*</exclude>
????????????????????????????????</excludes>
????????????????????????????????&lt;!&ndash;?將javassist包打包到Agent中?&ndash;&gt;
????????????????????????????????<includes>
????????????????????????????????????<include>javassist:javassist:jar:</include>
????????????????????????????????</includes>
????????????????????????????</artifactSet>-->
????????????????????????????<filters>
????????????????????????????????<filter>
????????????????????????????????????<artifact>net.bytebuddy:byte-buddy</artifact>
????????????????????????????????????<excludes>
????????????????????????????????????????<exclude>META-INF/versions/9/module-info.class</exclude>
????????????????????????????????????</excludes>
????????????????????????????????</filter>
????????????????????????????</filters>
????????????????????????</configuration>
????????????????????</execution>
????????????????</executions>
????????????</plugin>
????????</plugins>
????</build>

打包方式很簡單,我們在項目根目錄執(zhí)行打包命令

mvn clean package

打完包后我們的項目target目錄出現(xiàn)了我們的agent

spring boot 項目接入

我們在spring boot項目添加如下啟動參數(shù)

-javaagent:/Users/weihu/Desktop/sofe/java/weihubeats_demos/java-demos/agent-demo/target/java-agent-demo.jar=xiaozouParam=xiaozou

然后我們啟動參數(shù),查看log

可以看到啟動成功了

總結(jié)

java agent的增強主要用兩種方式agentmainpremain大多應(yīng)用程序應(yīng)該是使用的premain,因為可以看到agentmain還需要應(yīng)用系統(tǒng)自己添加代碼去觸發(fā)

agent的一些基礎(chǔ)方法和接入使用,其實agent的字節(jié)碼編程開發(fā)才是最麻煩的。 后續(xù)我們也會學(xué)習(xí)字節(jié)碼編程

以上就是Java agent的入門與demo演示詳解的詳細內(nèi)容,更多關(guān)于Java agent的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用springboot結(jié)合vue實現(xiàn)sso單點登錄

    使用springboot結(jié)合vue實現(xiàn)sso單點登錄

    這篇文章主要為大家詳細介紹了如何使用springboot+vue實現(xiàn)sso單點登錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 詳解Spring Boot使用系統(tǒng)參數(shù)表提升系統(tǒng)的靈活性

    詳解Spring Boot使用系統(tǒng)參數(shù)表提升系統(tǒng)的靈活性

    Spring Boot項目中常有一些相對穩(wěn)定的參數(shù)設(shè)置項,其作用范圍是系統(tǒng)級的或模塊級的,這些參數(shù)稱為系統(tǒng)參數(shù)。這些變量以參數(shù)形式進行配置,從而提高變動和擴展的靈活性,保持代碼的穩(wěn)定性
    2021-06-06
  • Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(以ribbon為例)

    Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(以ribbon為例)

    這篇文章主要介紹了Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(以ribbon為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java 和 Scala 如何調(diào)用變參

    Java 和 Scala 如何調(diào)用變參

    這篇文章主要介紹了Java 和 Scala 如何調(diào)用變參,幫助大家更好的理解和學(xué)習(xí)Java與Scala,感興趣的朋友可以了解下
    2020-09-09
  • 完美解決idea無法搜索下載插件的問題

    完美解決idea無法搜索下載插件的問題

    這篇文章主要介紹了完美解決idea無法搜索下載插件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java?Agent?(代理)探針技術(shù)詳情

    Java?Agent?(代理)探針技術(shù)詳情

    這篇文章主要介紹了Java?Agent?探針技術(shù)詳情,Java?中的?Agent?技術(shù)可以讓我們無侵入性的去進行代理,最常用于程序調(diào)試、熱部署、性能診斷分析等場景,下文更多相關(guān)資料,感興趣的小伙伴可以參考一下
    2022-04-04
  • springboot中.yml文件參數(shù)的讀取方式

    springboot中.yml文件參數(shù)的讀取方式

    這篇文章主要介紹了springboot中.yml文件參數(shù)的讀取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 用Java代碼實現(xiàn)一幅春聯(lián)詳解

    用Java代碼實現(xiàn)一幅春聯(lián)詳解

    大家好,本篇文章主要講的是用Java代碼實現(xiàn)一幅春聯(lián)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Java設(shè)計模式之橋接模式詳解

    Java設(shè)計模式之橋接模式詳解

    橋接模式(Bridge Pattern)是一種結(jié)構(gòu)型設(shè)計模式,用于將抽象部分和實現(xiàn)部分`分離開來,從而使它們可以獨立地進行變化,本節(jié)給大家講一下設(shè)計模式中的橋接模式,并結(jié)合實際業(yè)務(wù)場景給大家講解如何使用,需要的朋友可以參考下
    2023-07-07
  • springboot結(jié)合前端實現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能實例

    springboot結(jié)合前端實現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能實例

    今天處理Springboot統(tǒng)一異常攔截的時候,遇到了頁面跳轉(zhuǎn)的問題,這篇文章主要給大家介紹了關(guān)于springboot結(jié)合前端實現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12

最新評論

钟祥市| 南涧| 大英县| 玉林市| 视频| 乌鲁木齐县| 攀枝花市| 正镶白旗| 上犹县| 厦门市| 松阳县| 历史| 布拖县| 枣强县| 额敏县| 徐水县| 平阴县| 兴海县| 枞阳县| 东宁县| 临泉县| 嘉荫县| 宜城市| 三台县| 长顺县| 宾川县| 揭西县| 兴仁县| 郁南县| 沂源县| 新密市| 九台市| 哈巴河县| 石景山区| 特克斯县| 台东市| 新河县| 二连浩特市| 紫金县| 嘉祥县| 镇赉县|