Java调用链跟踪关键技术(二)Javaagent

一、Javaagent网上关于Javaagent的介绍很多,请找度娘和谷兄。唯一提的一点是字节码注入比较好用的是bytebuddy,封装度很高,使用简单。二、代码样例以下为关键代码样例,可以依样画瓢自行改造。1.编写agent入口package com.javashizhan.trace;import static net.bytebuddy.matcher.ElementMatch...
摘要由CSDN通过智能技术生成

一、Javaagent

网上关于Javaagent的介绍很多,请找度娘和谷兄。唯一提的一点是字节码注入比较好用的是bytebuddy,封装度很高,使用简单。

二、代码样例

以下为关键代码样例,可以依样画瓢自行改造。
1.编写agent入口

package com.javashizhan.trace;

import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isSetter;
import static net.bytebuddy.matcher.ElementMatchers.nameContainsIgnoreCase;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWithIgnoreCase;
import static net.bytebuddy.matcher.ElementMatchers.not;

import java.lang.instrument.Instrumentation;

import com.javashizhan.trace.interceptor.AbstractJunction;
import com.javashizhan.trace.interceptor.ProtectiveShieldMatcher;
import com.javashizhan.trace.interceptor.TraceInterceptor;

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.NamedElement;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;

public class TraceAgent {
   
	
	public static void premain(String arguments, Instrumentation instrumentation) {
    
		new AgentBuilder.Default()
		.type(buildMatch())
		.transform((builder, type, classLoader, module) ->
		builder.method(ElementMatchers.any())
						.intercept(MethodDelegation.to(TraceInterceptor.class)) // 拦截器
		).installOn(instrumentation);
	}
	
	public static ElementMatcher<? super TypeDescription> buildMatch() {
   
		ElementMatcher.Junction judge = new AbstractJunction<NamedElement>() {
   
            @Override
            public boolean matches(NamedElement target) {
   
                return true;
            }
        };
        judge = judge.and(not(isInterface())).and(not(isSetter()))
        		.and(nameStartsWithIgnoreCase("io.spring"))
				.and(not(nameContainsIgnoreCase("util")))
        		.and(not(nameContainsIgnoreCase("interceptor")));
        judge = judge.and(not(isSetter()));
        return new ProtectiveShieldMatcher(judge);
	}

}

2.拦截器类TraceInterceptor.java

package com.javashizhan.trace.interceptor;

import java.io.I
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值