使用Byte Buddy for Java Agent
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Byte Buddy for Java Agent,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4672字,纯文字阅读大概需要7分钟。
内容图文
![使用Byte Buddy for Java Agent](/upload/InfoBanner/zyjiaocheng/780/b84d2417f21d459ab1070e17e0a3b811.jpg)
我想创建一个代理人来附加我们的现场Tomcat& Weblogic服务器将拦截对我公司包中声明的所有类的所有方法调用,并对执行时间等指标进行一些记录.
我遇到了Byte Buddy图书馆,它似乎迎合了这一点.但是,我并不是100%明确使用Byte Buddy创建代理的方法:
>以下文章建议创建一个自己的代理,并且不提及byte-buddy-agent:http://mydailyjava.blogspot.ie/2015/01/make-agents-not-frameworks.html
>但是,我确实看到有人创建了他/她自己的byte-buddy-agent,所以我是
不确定我是否打算使用它.
https://github.com/raphw/byte-buddy/tree/master/byte-buddy-agent
我采用了创建自己的代理的方法并使用Maven将其打包,将Byte Buddy包含为胖罐(以便Byte Buddy代码在类路径上),我从catalina.bat中引用它.
编辑:我已经下载了源代码,并发现AgentBuilder依赖于byte-buddy-agent包,因此上述问题无关紧要.
Tomcat启动正常,我可以看到代理被调用,因为我看到“输入的premain”System.out.
但是,当我在部署到Tomcat的单独war文件上执行代码时,我从未看到“Intercepted”System.out.
编辑:根据Rafael的回复更新下面的代码,现在正在运行.
有人可以告诉我这里可能做错了什么吗?我在下面列出了代理商代码.
此外,有人可以告诉我哪些ElementMatchers最适合包匹配?我尝试过nameStartsWith,但它没有任何效果,API文档也没有说明它是否是完全限定的类名.
*编辑:nameStartsWith确实检查包. *
无论如何,提前感谢任何帮助!
package com.mycompany.agent;
import java.lang.instrument.Instrumentation;
import java.util.concurrent.Callable;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.matcher.ElementMatchers;
public class MyAgent {
public static void premain(String agentArgument, Instrumentation instrumentation) {
System.out.println("Entered premain");
try{
new AgentBuilder.Default()
.withListener( new AgentBuilder.Listener() {
public void onComplete(String arg0) {
System.out.println("Completed - " + arg0);
}
public void one rror(String arg0, Throwable arg1) {
System.out.println("Error - " + arg0+", "+arg1.getMessage());
arg1.printStackTrace();
}
public void onIgnored(String arg0) {
System.out.println("Ignored - " + arg0);
}
public void onTransformation(TypeDescription arg0, DynamicType arg1) {
System.out.println("Transformed - " + arg0+", type = "+arg1);
}
})
.rebase(ElementMatchers.nameStartsWith("com.mycompany"))
.transform(new AgentBuilder.Transformer() {
public DynamicType.Builder transform(DynamicType.Builder builder, TypeDescription typeDescription) {
return builder.method(ElementMatchers.any()).intercept(MethodDelegation.to(new Interceptor()));
}
}).installOn(instrumentation);
}
catch (RuntimeException e) {
System.out.println("Exception instrumenting code : "+e);
e.printStackTrace();
}
}
package com.mycompany.agent;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
@SuppressWarnings("rawtypes")
public class Interceptor {
@RuntimeType
public Object intercept( @SuperCall Callable<?> callable, @AllArguments Object[] allArguments, @Origin Method method, @Origin Class clazz) throws Exception {
long startTime = System.currentTimeMillis();
Object response;
try{
response = callable.call();
}
catch(Exception e) {
System.out.println("Exception occurred in method call: " + methodName(clazz, method, allArguments) + " Exception = " + e);
throw e;
}
finally{
System.out.println("Method " + methodName(clazz, method) + " completed in " + (System.currentTimeMillis() - startTime) + " miliseconds");
}
return response;
}
private String methodName(Class clazz, Method method){
return methodName(clazz, method, null);
}
private String methodName(Class clazz, Method method, Object[] allArguments){
StringBuilder builder = new StringBuilder();
builder.append(clazz.getName());
builder.append(".");
builder.append(method.getName());
builder.append("(");
for(int i = 0; i < method.getParameters().length; i++) {
builder.append(method.getParameters()[i].getName());
if(allArguments != null) {
Object arg = allArguments[i];
builder.append("=");
builder.append(arg != null ? arg.toString() : "null");
}
if(i < method.getParameters().length - 1) {
builder.append(", ");
}
}
builder.append(")");
return builder.toString();
}
解决方法:
一切似乎都是正确的.您应该总是尝试注册AgentBuider.Listener,如果Byte Buddy导致发出非法检测尝试的异常,则会暴露不成功的工具的堆栈跟踪.
我假设您的类的Interceptor的包私有定义是此异常的原因.您的拦截器必须对所有已检测的代码可见.否则,该类不可调用.
内容总结
以上是互联网集市为您收集整理的使用Byte Buddy for Java Agent全部内容,希望文章能够帮你解决使用Byte Buddy for Java Agent所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。