成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

java agent 詳細(xì)介紹

zhiwei / 1910人閱讀

摘要:簡(jiǎn)介是命令的一個(gè)參數(shù)。參數(shù)可以用于指定一個(gè)包,并且對(duì)該包有個(gè)要求這個(gè)包的文件必須指定項(xiàng)。重點(diǎn)就在方法,也就是我們今天的標(biāo)題。和類(lèi)加載器比較類(lèi)加載器也可以實(shí)現(xiàn)運(yùn)行時(shí)修改代碼。使用能讓修改字節(jié)碼這個(gè)動(dòng)作化于無(wú)形,對(duì)業(yè)務(wù)透明,減少侵入性。

簡(jiǎn)介

java agent是java命令的一個(gè)參數(shù)。參數(shù) javaagent 可以用于指定一個(gè) jar 包,并且對(duì)該 java 包有2個(gè)要求:

這個(gè) jar 包的MANIFEST.MF 文件必須指定 Premain-Class 項(xiàng)。

Premain-Class 指定的那個(gè)類(lèi)必須實(shí)現(xiàn) premain()方法。

重點(diǎn)就在 premain 方法,也就是我們今天的標(biāo)題。從字面上理解,就是運(yùn)行在 main 函數(shù)之前的的類(lèi)。當(dāng)Java 虛擬機(jī)啟動(dòng)時(shí),在執(zhí)行 main 函數(shù)之前,JVM 會(huì)先運(yùn)行 -javaagent 所指定 jar 包內(nèi) Premain-Class 這個(gè)類(lèi)的 premain 方法,其中,該方法可以簽名如下:

1.public static void premain(String agentArgs, Instrumentation inst)
2.public static void premain(String agentArgs)

JVM 會(huì)優(yōu)先加載 1 簽名的方法,加載成功忽略 2,如果1 沒(méi)有,加載 2 方法。這個(gè)邏輯在sun.instrument.InstrumentationImpl 類(lèi)中:

如何使用

1 首先定義一個(gè) MANIFEST.MF 文件:

Manifest-Version: 1.0
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Premain-Class: cn.think.in.java.clazz.loader.asm.agent.PreMainTraceAgent

創(chuàng)建一個(gè)Premain-Class 指定的類(lèi),類(lèi)中包含 premain 方法:

public class Main {

    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("agentArgs : " + agentArgs);
        inst.addTransformer(new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
                                    ProtectionDomain protectionDomain, byte[] classfileBuffer)
                    throws IllegalClassFormatException {
                System.out.println("premain load Class     :" + className);
                return classfileBuffer;
            }
        }, true);
    }
}

將 premain 的類(lèi)和 MANIFEST.MF 文件打成 jar 包 .
使用 IDEA 的 build ,當(dāng)然你也可以使用 maven
再簡(jiǎn)單創(chuàng)建一個(gè)test類(lèi)
public class AccountMain {

public static void main(String[] args)
        throws ClassNotFoundException, InterruptedException, IllegalAccessException, InstantiationException, NoSuchMethodException,
               InvocationTargetException {
    System.out.println("11111111111");
}

}
使用參數(shù) -javaagent:jar包名 啟動(dòng)要代理的方法。

和類(lèi)加載器比較

類(lèi)加載器也可以實(shí)現(xiàn)運(yùn)行時(shí)修改代碼。但是對(duì)代碼的侵入性很高。使用 java agent 能讓修改字節(jié)碼這個(gè)動(dòng)作化于無(wú)形,對(duì)業(yè)務(wù)透明,減少侵入性。

agent的缺點(diǎn)

需要設(shè)置參數(shù)javaagent

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76703.html

相關(guān)文章

  • New Relic性能監(jiān)控(二)應(yīng)用監(jiān)控APM

    摘要:左邊側(cè)邊欄分為三個(gè)組,分別為監(jiān)控?cái)?shù)據(jù),事件和報(bào)告。從接到請(qǐng)求到響應(yīng)處理完成的過(guò)程為稱(chēng)為一次事務(wù)。針對(duì)應(yīng)用,還提供性能監(jiān)控?cái)?shù)據(jù),包括內(nèi)存使用,線程數(shù)等等。 New Relic性能監(jiān)控(二)應(yīng)用監(jiān)控APM 2018-04-12 瑯琊書(shū)生本系列文章基于公司使用New Relic的經(jīng)驗(yàn),鑒于國(guó)內(nèi)較少有這方面的文章,因此把我工作中了解到的知識(shí)分享給大家,希望可以給需要的朋友帶來(lái)幫助。 上期文章...

    wangxinarhat 評(píng)論0 收藏0
  • UAV MOF工作原理之Agent注入機(jī)制原理

    摘要:注入機(jī)制作為工作的基礎(chǔ),也為無(wú)侵入捕獲應(yīng)用數(shù)據(jù)提供可能。代碼注入機(jī)制結(jié)合和技術(shù),在應(yīng)用字節(jié)碼加載到之前進(jìn)行字節(jié)碼改寫(xiě)。當(dāng)然,修改字節(jié)碼文件流的動(dòng)作是在中進(jìn)行的。 UAVStack的中間件增強(qiáng)框架專(zhuān)題(MOF)】為大家詳細(xì)講述UAV中的MOF Agent是如何借助javaagent(premain)和javaassist技術(shù)在對(duì)應(yīng)用無(wú)侵入的前提下完成數(shù)據(jù)捕獲的。歡迎繼續(xù)關(guān)注UAVStac...

    atinosun 評(píng)論0 收藏0
  • 程序員練級(jí)攻略(2018):Java底層知識(shí)

    摘要:最黑科技的玩法就是字節(jié)碼編程,也就是動(dòng)態(tài)修改或是動(dòng)態(tài)生成字節(jié)碼。使用字節(jié)碼編程可以玩出很多高級(jí)玩法,其中最高級(jí)的玩法是在程序運(yùn)行時(shí)進(jìn)行字節(jié)碼修改和代碼注入。 showImg(https://segmentfault.com/img/bVbkqqg?w=1142&h=640);這個(gè)是我訂閱 陳皓老師在極客上的專(zhuān)欄《左耳聽(tīng)風(fēng)》,我貼出來(lái)是為了自己以后方便學(xué)習(xí)和記憶,同時(shí)也分享給你們一起學(xué)習(xí)...

    wean 評(píng)論0 收藏0
  • 深入字節(jié)碼 -- 計(jì)算方法執(zhí)行時(shí)間

    摘要:什么是字節(jié)碼程序通過(guò)編譯之后生成文件就是字節(jié)碼集合正是有這樣一種中間碼字節(jié)碼,使得等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在上。 什么是字節(jié)碼? java程序通過(guò)javac編譯之后生成文件.class就是字節(jié)碼集合,正是有這樣一種中間碼(字節(jié)碼),使得scala/groovy/clojure等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在JVM上。看看一段簡(jiǎn)單代碼。 public long ...

    娣辯孩 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<