在Java中,使用
为了解决这个问题,我尝试使用ByteBuddy在运行时创建代理类,但是文档在这方面看起来不够清晰。
我该如何创建一个
编辑:
为了更好地说明我的问题,我提供了一个示例来说明我的目标:
我正在构建一个RPC系统。对于每个方法调用的两端,在JVM下都有定义合同的接口(当调用者/被调用者都在运行时)。
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
。
InvocationHandler
比JRE生成的java.lang.reflect.Proxy
调用InvocationHandler
更有效率... - HolgerwithAllArguments()
方法出现问题,而不是with(Object...)
方法。此外,方法的可变参数特性可以在运行时检测到... - Holger