首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效地获取字节伙伴的MethodDelegation中的调用者

高效地获取字节伙伴的MethodDelegation中的调用者
EN

Stack Overflow用户
提问于 2019-01-07 20:53:42
回答 1查看 378关注 0票数 2

我正试图在我的java代理中构建一个带有字节好友库的调用树。要将元素添加到树中,我希望使用方法委托。但是,要确定谁是任何叶子的父级,我需要知道是谁调用了该方法。

我不想用:

代码语言:javascript
复制
sun.reflect.Reflection#getCallerClass(int)

因为它在Java 8+中是不推荐的和不可用的。另外,我试过:

代码语言:javascript
复制
public class ThreadUtil {

public static StackTraceElement getCaller() {
    Instant now = Instant.now();
    StackTraceElement ste = Thread.currentThread().getStackTrace()[3];
    String callerClass = ste.getClassName();
    String callerMethod = ste.getMethodName();
    Instant now2= Instant.now();
    System.out.println(Duration.between(now, now2));
    return ste;
}

}

但是,它是非常慢的(~1毫秒-如果我有成千上万的电话太多)。

有什么方法可以让调用者在这一点上高效地使用(也许是一些字节伙伴的技巧)?

我的经纪人:

代码语言:javascript
复制
private static void instrument(String agentOps, Instrumentation inst) {
    System.out.println("Agent");
    new AgentBuilder.Default().with(new Eager())
            .ignore(ElementMatchers.nameContains("com.dvelopp.agenttest"))
            .type((ElementMatchers.any()))
            .transform((builder, typeDescription, classLoader, module) -> builder.method(ElementMatchers.any())
                    .intercept(MethodDelegation.to(Interceptor.class))).installOn(inst);
}

public static class Interceptor {

    @RuntimeType
    public static Object intercept(@SuperCall Callable<?> zuper, @Origin Method method,
                                   @AllArguments Object[] args, @This(optional = true) Object me) throws Exception {
        System.out.println("CURRENT: " + method.getDeclaringClass().getName());
        System.out.println("CALLER: " + ThreadUtil.getCaller().getClassName());
        return zuper.call();
    }

}

环境: Java 8

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-09 07:07:39

字节码检测只允许您生成您也可以自己编写的代码。对于您的情况,您需要创建一个我不推荐的相当具有侵入性的工具:

  1. 测试您的目标方法以接受Class类型的新参数。
  2. 测试每一个调用者提供他们的类型作为额外的参数。

更好的解决办法肯定是霍尔格在评论中提出的建议。使用StackWalker,如果不可用,请回到sun.reflect.Reflection (我知道的所有JVM中都有)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54081733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档