java agent 使用及實(shí)現(xiàn)代碼
java agent的作用
在字節(jié)碼這個(gè)層面對(duì)類和方法進(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);// 使用全稱,用于取得字節(jié)碼類<使用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ù)加載類
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ù)加載類
<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ì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java如何找出數(shù)組中重復(fù)的數(shù)字
這篇文章主要為大家詳細(xì)介紹了Java如何找出數(shù)組中重復(fù)的數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
java并發(fā)請(qǐng)求下數(shù)據(jù)插入重復(fù)問題的解決方法
現(xiàn)在遇到一個(gè)項(xiàng)目,移動(dòng)設(shè)備存儲(chǔ)數(shù)據(jù),然后一起上傳,那就出現(xiàn)了許多重復(fù)數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java并發(fā)請(qǐng)求下數(shù)據(jù)插入重復(fù)問題的解決方法,需要的朋友可以參考下2021-11-11
SpringBoot集成Druid實(shí)現(xiàn)多數(shù)據(jù)源的兩種方式
這篇文章主要介紹了SpringBoot集成Druid實(shí)現(xiàn)多數(shù)據(jù)源的兩種方式,集成com.baomidou的方式和基于AOP手動(dòng)實(shí)現(xiàn)多數(shù)據(jù)源原生的方式,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-03-03
SpringBoot集成slf4j2日志配置的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot集成slf4j2日志配置的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法
本文主要介紹了Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
SpringBoot實(shí)現(xiàn)阿里云短信發(fā)送的示例代碼
這篇文章主要為大家介紹了如何利用SpringBoot實(shí)現(xiàn)阿里云短信發(fā)送,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-04-04
關(guān)于Http持久連接和HttpClient連接池的深入理解
眾所周知,httpclient是java開發(fā)中非常常見的一種訪問網(wǎng)絡(luò)資源的方式了,下面這篇文章主要給大家介紹了關(guān)于Http持久連接和HttpClient連接池的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05

