摘要:介紹是插件或者叫做代理,她是運(yùn)行在方法之前,她內(nèi)定的方法名稱叫。是不是很簡(jiǎn)單啊。。。。接下來,我們看看使用方式咯。。。。。注意包的結(jié)構(gòu)要一樣哦。。。。。好了,今天的文章到這里就結(jié)束了。。。最后還來一張運(yùn)行結(jié)果吧。。。。
java agent介紹
java agent是jvm插件或者叫做代理,她是運(yùn)行在main方法之前,她內(nèi)定的方法名稱叫premain。
java agent 概述
接下來我們進(jìn)行開發(fā)
實(shí)現(xiàn)premain方法
package org.xxz; public class AgentMain { public static void premain(String args, Instrumentation inst) { System.out.println("hello java agent"); } }
上面的這段代碼就完成了java agent的第一步了
打包
這里我們使用maven的方式進(jìn)行打包,請(qǐng)看下面的配置文件
java-agent org.apache.maven.plugins maven-compiler-plugin 1.8 utf-8 org.apache.maven.plugins maven-assembly-plugin 3.0.0 true org.xxz.AgentMain jar-with-dependencies make-assembly package single
使用java agent
新建一個(gè)maven工程,打包然后運(yùn)行
java -jar demo.jar -javaagent:/apps/java-agent.jar
執(zhí)行上面的運(yùn)行命令后,在我們控制臺(tái)輸出時(shí)就會(huì)看到hello java agent的字樣哦?。?!
看到這里就結(jié)束了嗎?沒有哦,我們來看一個(gè)小例子。。。。。。。
新建maven工程
java-agent --src --main --java --org.xxz --AgentMain.java --TimeInterceptor.java --TraceTime.java --resource --test --pom.xml
首先看看我們的pom.xml是如何配置的
4.0.0 org.xxz java-agent 1.0 1.8.0 1.7.25 net.bytebuddy byte-buddy ${bytebuddy.version} org.slf4j slf4j-api ${slf4j.version} org.apache.maven.plugins maven-compiler-plugin 1.8 utf-8 org.apache.maven.plugins maven-assembly-plugin 3.0.0 true org.xxz.AgentMain jar-with-dependencies make-assembly package single
這里我們使用了bytebuddy,不懂得看官可以上官方網(wǎng)站瞧瞧http://bytebuddy.net/
再來看看我們得AgentMain.java
package org.xxz; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.utility.JavaModule; import java.lang.instrument.Instrumentation; /** * @author tt */ public class AgentMain { public static void premain(String args, Instrumentation inst) { AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() { @Override public DynamicType.Builder> transform(DynamicType.Builder> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) { return builder .method(ElementMatchers.any()) // 攔截任意方法 .intercept(MethodDelegation.to(TimeInterceptor.class)); // 委托 } }; AgentBuilder.Listener listener = new AgentBuilder.Listener() { @Override public void onDiscovery(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) { } @Override public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b, DynamicType dynamicType) { } @Override public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b) { } @Override public void onError(String s, ClassLoader classLoader, JavaModule javaModule, boolean b, Throwable throwable) { } @Override public void onComplete(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) { } }; new AgentBuilder .Default() .type(ElementMatchers.nameStartsWith("org.xxz"))// 指定需要攔截的類 .transform(transformer) .with(listener) .installOn(inst); } }
這里我們看看我們得TimeInterceptor.java
package org.xxz; import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; import java.lang.reflect.Method; import java.util.concurrent.Callable; /** * @author tt */ public class TimeInterceptor { @RuntimeType public static Object interceptor(@Origin Class clazz, @Origin Method method, @SuperCall Callable> callable) throws Exception { TraceTime traceTime = method.getAnnotation(TraceTime.class); if (traceTime == null) { return callable.call(); } long start = System.currentTimeMillis(); try { // 原有函數(shù)執(zhí)行 return callable.call(); } finally { System.out.println(clazz.getSimpleName() + "#" + method.getName() + " cost " + (System.currentTimeMillis() - start) + "ms"); } } }
最后就是我們得注解了TraceTime.java
package org.xxz; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author tt */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TraceTime { }
到這里我們得java-agent就開發(fā)完成了。。。。。是不是很簡(jiǎn)單啊。。。。
接下來,我們看看使用方式咯。。。。。
java-agent-test --src --main --java --org.xxz --test --AgentMainTest.java --Demo.java --TraceTime.java --resource --test --pom.xml
依舊先看我們得pom文件
4.0.0 org.xxz java-agent-test 1.0 org.apache.maven.plugins maven-compiler-plugin 1.8 utf-8
這里的pom文件上面的簡(jiǎn)單多了。
看看我們的測(cè)試類AgentMainTest.java
package org.xxz.test; /** * @author tt */ public class AgentMainTest { public static void main(String[] args) throws Exception { Demo demo = new Demo(); demo.print("agent"); } }
看看我們的Demo.java
package org.xxz.test; import org.xxz.TraceTime; /** * @author tt */ public class Demo { @TraceTime public void print(String string) throws InterruptedException { Thread.sleep(100L); System.out.println("hello " + string); } }
這里還少了一個(gè)TraceTime.java,把上面的拷貝過來哦。。。。注意包的結(jié)構(gòu)要一樣哦。。。。。
上面介紹了如何命令行使用java-agent.jar,這里我們介紹如何再IDE中使用,要上圖了哦。。。。。
好了,今天的文章到這里就結(jié)束了。。。
最后還來一張運(yùn)行結(jié)果吧。。。。
原文地址:https://blog.uyiplus.com/2018/java-agent-01/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76353.html
摘要:目前此系統(tǒng)僅支持類系統(tǒng)下使用,不支持系統(tǒng)什么是這是一個(gè)獲取各種系統(tǒng)的監(jiān)控?cái)?shù)據(jù)的。監(jiān)控?cái)?shù)據(jù)上報(bào)公有的跟官方社區(qū)的思想一致采集的系統(tǒng)監(jiān)控信息如內(nèi)存等等一百多種沒有任何信息其他的業(yè)務(wù)系統(tǒng)的監(jiān)控都會(huì)打上。 OpenFalcon-SuitAgent 項(xiàng)目地址:github 版本說明 本系統(tǒng)版本劃分如下 alpha:內(nèi)部測(cè)試版(不建議使用于生產(chǎn)環(huán)境) beta:公開測(cè)試版(不建議使用于生產(chǎn)環(huán)境)...
摘要:目前此系統(tǒng)僅支持類系統(tǒng)下使用,不支持系統(tǒng)什么是這是一個(gè)獲取各種系統(tǒng)的監(jiān)控?cái)?shù)據(jù)的。監(jiān)控?cái)?shù)據(jù)上報(bào)公有的跟官方社區(qū)的思想一致采集的系統(tǒng)監(jiān)控信息如內(nèi)存等等一百多種沒有任何信息其他的業(yè)務(wù)系統(tǒng)的監(jiān)控都會(huì)打上。 OpenFalcon-SuitAgent 項(xiàng)目地址:github 版本說明 本系統(tǒng)版本劃分如下 alpha:內(nèi)部測(cè)試版(不建議使用于生產(chǎn)環(huán)境) beta:公開測(cè)試版(不建議使用于生產(chǎn)環(huán)境)...
摘要:什么是字節(jié)碼程序通過編譯之后生成文件就是字節(jié)碼集合正是有這樣一種中間碼字節(jié)碼,使得等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在上。 什么是字節(jié)碼? java程序通過javac編譯之后生成文件.class就是字節(jié)碼集合,正是有這樣一種中間碼(字節(jié)碼),使得scala/groovy/clojure等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在JVM上??纯匆欢魏?jiǎn)單代碼。 public long ...
摘要:背景目前應(yīng)用越來越廣泛,但和的體系接入困難,所以我們需要實(shí)現(xiàn)端的邏輯。使用實(shí)現(xiàn)一個(gè)可用的完全沒有問題,最簡(jiǎn)單的實(shí)現(xiàn)則是在對(duì)應(yīng)集群注冊(cè)接口與機(jī)器的映射關(guān)系,便可以訪問對(duì)應(yīng)接口。在評(píng)估了各種實(shí)現(xiàn)方案后,決定放棄開發(fā)端,使用的模式。 背景 目前nodejs應(yīng)用越來越廣泛,但和java的dubbo體系接入困難,所以我們需要實(shí)現(xiàn)node端的dubbo provider邏輯。java的dubbo ...
閱讀 3038·2023-04-25 18:06
閱讀 3307·2021-11-22 09:34
閱讀 2869·2021-08-12 13:30
閱讀 2058·2019-08-30 15:44
閱讀 1671·2019-08-30 13:09
閱讀 1639·2019-08-30 12:45
閱讀 1726·2019-08-29 11:13
閱讀 3617·2019-08-28 17:51