摘要:介紹是插件或者叫做代理,她是運行在方法之前,她內定的方法名稱叫。是不是很簡單啊。。。。接下來,我們看看使用方式咯。。。。。注意包的結構要一樣哦。。。。。好了,今天的文章到這里就結束了。。。最后還來一張運行結果吧。。。。
java agent介紹
java agent是jvm插件或者叫做代理,她是運行在main方法之前,她內定的方法名稱叫premain。
java agent 概述
接下來我們進行開發
實現premain方法
package org.xxz; public class AgentMain { public static void premain(String args, Instrumentation inst) { System.out.println("hello java agent"); } }
上面的這段代碼就完成了java agent的第一步了
打包
這里我們使用maven的方式進行打包,請看下面的配置文件
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
新建一個maven工程,打包然后運行
java -jar demo.jar -javaagent:/apps/java-agent.jar
執行上面的運行命令后,在我們控制臺輸出時就會看到hello java agent的字樣哦!!!
看到這里就結束了嗎?沒有哦,我們來看一個小例子。。。。。。。
新建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,不懂得看官可以上官方網站瞧瞧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 { // 原有函數執行 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就開發完成了。。。。。是不是很簡單啊。。。。
接下來,我們看看使用方式咯。。。。。
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文件上面的簡單多了。
看看我們的測試類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); } }
這里還少了一個TraceTime.java,把上面的拷貝過來哦。。。。注意包的結構要一樣哦。。。。。
上面介紹了如何命令行使用java-agent.jar,這里我們介紹如何再IDE中使用,要上圖了哦。。。。。
好了,今天的文章到這里就結束了。。。
最后還來一張運行結果吧。。。。
原文地址:https://blog.uyiplus.com/2018/java-agent-01/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76353.html
摘要:目前此系統僅支持類系統下使用,不支持系統什么是這是一個獲取各種系統的監控數據的。監控數據上報公有的跟官方社區的思想一致采集的系統監控信息如內存等等一百多種沒有任何信息其他的業務系統的監控都會打上。 OpenFalcon-SuitAgent 項目地址:github 版本說明 本系統版本劃分如下 alpha:內部測試版(不建議使用于生產環境) beta:公開測試版(不建議使用于生產環境)...
摘要:目前此系統僅支持類系統下使用,不支持系統什么是這是一個獲取各種系統的監控數據的。監控數據上報公有的跟官方社區的思想一致采集的系統監控信息如內存等等一百多種沒有任何信息其他的業務系統的監控都會打上。 OpenFalcon-SuitAgent 項目地址:github 版本說明 本系統版本劃分如下 alpha:內部測試版(不建議使用于生產環境) beta:公開測試版(不建議使用于生產環境)...
摘要:什么是字節碼程序通過編譯之后生成文件就是字節碼集合正是有這樣一種中間碼字節碼,使得等函數語言只用實現一個編譯器即可運行在上。 什么是字節碼? java程序通過javac編譯之后生成文件.class就是字節碼集合,正是有這樣一種中間碼(字節碼),使得scala/groovy/clojure等函數語言只用實現一個編譯器即可運行在JVM上。看看一段簡單代碼。 public long ...
摘要:背景目前應用越來越廣泛,但和的體系接入困難,所以我們需要實現端的邏輯。使用實現一個可用的完全沒有問題,最簡單的實現則是在對應集群注冊接口與機器的映射關系,便可以訪問對應接口。在評估了各種實現方案后,決定放棄開發端,使用的模式。 背景 目前nodejs應用越來越廣泛,但和java的dubbo體系接入困難,所以我們需要實現node端的dubbo provider邏輯。java的dubbo ...
閱讀 3027·2023-04-25 18:06
閱讀 3272·2021-11-22 09:34
閱讀 2857·2021-08-12 13:30
閱讀 2045·2019-08-30 15:44
閱讀 1661·2019-08-30 13:09
閱讀 1630·2019-08-30 12:45
閱讀 1715·2019-08-29 11:13
閱讀 3608·2019-08-28 17:51