gpt4 book ai didi

java - AOP重定向调用

转载 作者:行者123 更新时间:2023-11-30 06:02:41 27 4
gpt4 key购买 nike

我想使用 AOP 破解接口(interface)方法的调用,并通过反射使用 SPI 调用另一个实现。

有什么办法可以让我们以某种方式重定向调用的切入点/周围吗?

这是我的代码库

@Around(value = "@annotation(spiExtension)")
def aroundSourceMethod(joinPoint: ProceedingJoinPoint, spiExtension: SpiExtension): Unit = {
val interfaces = joinPoint.getTarget.getClass.getInterfaces
for(interface <- interfaces){
if (implementationLoadedByClazz.get(interface) == null) {
for (clazz <- ServiceLoader.load(interface)) {
val extensionClass: SpiExtensions = ComponentUtil.getComponentByImplementation(clazz.getClass, interface)
implementationsByCondition.put(extensionClass.condition, extensionClass)
implementationLoadedByClazz.put(interface, extensionClass)
}
}
}
invokeSpecificImplementation(joinPoint)
}

private def invokeSpecificImplementation(joinPoint: ProceedingJoinPoint) = {
val methodSignature = joinPoint.getSignature.asInstanceOf[MethodSignature]
val method = methodSignature.getMethod
val args = joinPoint.getArgs
val condition = args.apply(0).asInstanceOf[String]
val instance:Object = implementationsByCondition(condition)
Proxy.getInvocationHandler(instance).invoke(instance, method, args)
}

正如您所看到的,我使用反射调用我想要的方法,但是对该方法的原始请求会发生什么情况。我们通常会在@Around方法中添加joinPoint.proceed();

最佳答案

无限循环是因为AOP会像原来一样处理你的调用。您需要一种方法(一个标志)来捕获此类用例并跳过第二次调用的操作。并且还要检查您是否有动态代理,然后您可以获取原始函数并直接调用它。

关于java - AOP重定向调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968140/

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