gpt4 book ai didi

java - 是否可以使用@Advice.OnMethodEnter 从方法返回?

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:21 24 4
gpt4 key购买 nike

使用 Byte Buddy 的建议 API,是否可以在不实际执行的情况下从检测方法返回?

一个用例是实现缓存并返回缓存值(如果存在),而不是再次计算该值。

@Advice.OnMethodEnter
public static Object returnCachedValue(@Advice.Argument(0) String query) {
if (cache.containsKey(query)) {
// should "abort" method call
return cache.get(query);
}
}

我知道上面的代码示例只是创建了一个局部变量,我可以在 @Advice.OnMethodExit 方法中获取它。但是有没有办法在显式 return 上中止方法调用?如果是,这是否也适用于 void 方法?

最佳答案

不,这是不可能的,返回值只能从退出建议中设置。但它可以通过在值已经存在的情况下跳过原始方法来模拟,并在输入建议定义值的情况下通过从退出建议中设置该值来模拟:

class MyAdvice {
@Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class)
public static Object returnCachedValue(@Advice.Argument(0) String query) {
if (cache.containsKey(query)) {
return cache.get(query);
} else {
return null;
}
}

@Advice.OnMethodExit
public static void processCachedValue(
@Advice.Return(readOnly = false, typing = DYNAMIC) Object returned,
@Advice.Enter Object enter) {
if (enter != null) {
returned = enter;
} else {
cache.put(query, returned);
}
}
}

当然,如果缓存值为null,这将不起作用。为避免这种情况,您可以在某些实例中包装该值,以确保输入的值永远不会为 null。这样做还允许使用上述模式来void 方法。

这在编程上可能看起来不方便,但建议的想法是字节好友可以使用建议类作为模板并内联字节代码,而无需太多工作以避免运行时开销。

关于java - 是否可以使用@Advice.OnMethodEnter 从方法返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50237592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com