在 Java 中,可以使用InvocationHandler
. 尽管 JVM 进行了优化,但使用反射调用方法总是会有一些开销。
为了尝试解决这个问题,我尝试使用 ByteBuddy 在运行时创建代理类,但是文档在这方面似乎不够清楚。
如何创建一个MethodCallProxy
以便将方法调用转发到某个类实例?
编辑:
为了更好地澄清我的问题,我提供了一个我想要实现的示例:
我正在构建一个 RPC 系统。在方法调用的每一端,我都有一个定义契约的接口(当调用者/被调用者都在 JVM 下运行时)。
@Contract
interface ISomeService {
fun someMethod(arg0: String, arg1: SomePojo): PojoResult
}
在调用站点,我注入了一个代理,它拦截所有方法调用并将它们转发给被调用者。
ByteBuddy()
.subclass(Any::class.java)
.implement(serviceClass)
// Service contract method delegation
.method(isDeclaredBy(serviceClass)).intercept(
MethodDelegation
.to(ServiceProxyInterceptor())
.filter(not(isDeclaredBy(Any::class.java)))
)
.make()
.load(this)
.loaded as Class<T>
最后,在被调用方,我有几个处理程序,每个服务方法一个,负责解组调用参数并将它们转发到服务实现。
@Service
class SomeServiceImpl {
fun someMethod(arg0: String, arg1: SomePojo): PojoResult {
// ...
}
}
我可以使用代码生成来解决这个问题,但是生成的jar
文件可能会变得非常大。因此,我想创建这些处理程序的通用版本,并在每个实例中附加一个代理,该代理拦截每个方法调用ISomeService
并将它们转发到SomeServiceImpl
.