I could solve this problem using code generation, but the resulting jar file can become very big. Thus, I want to create a generic version of these handlers and, in each instance, attach a proxy that intercepts every method call to ISomeService and forwards them to SomeServiceImpl.推荐答案在Byte Buddy中有多种创建代理类的方法.确切的方法取决于您的用例.最简单的方法可能是使用 InvocationHandlerAdapter .假设您要为 SomeClass 创建代理,则可以使用以下命令创建一个代理:There are many ways of creating proxy classes in Byte Buddy. The exact way depends on your use-case. The easiest way might be to use the InvocationHandlerAdapter. Given that you want to create a proxy for SomeClass, you can create one using:Class<? extends SomeClass> proxy = new ByteBuddy() .subclass(SomeClass.class) .method(ElementMatchers.any()) .intercept(InvocationHandlerAdapter.of(invocationHandler)) .make() .load(SomeClass.class.getClassLoader());如果要创建一个具有到不同实例的委托的代理,则还需要定义一个字段.可以按照以下说明进行操作:If you want to create a proxy with a delegate to different instance, you would additionally define a field. This can be done by the following instructions:Class<? extends SomeClass> proxy = new ByteBuddy() .subclass(SomeClass.class) .defineField("handler", InvocationHandler.class, Visibility.PUBLIC) .method(ElementMatchers.any()) .intercept(InvocationHandlerAdapter.toField("handler")) .make() .load(SomeClass.class.getClassLoader());您可以通过反射或通过实现setter接口(例如)来设置上述字段:You would set the above field via reflection or by implementing a setter interface such as for example:interface HandlerSetter { InvocationHandler getHandler(); void setHandler(InvocationHandler handler);}Class<? extends SomeClass> proxy = new ByteBuddy() .subclass(SomeClass.class) .defineField("handler", InvocationHandler.class, Visibility.PUBLIC) .implement(HandlerSetter.class) .intercept(FieldAccessor.ofField("handler")) .method(ElementMatchers.any()) .intercept(InvocationHandlerAdapter.toField("handler")) .make() .load(SomeClass.class.getClassLoader());您现在可以实例化该类并将其强制转换为用于设置处理程序的接口.You can now instantiate the class and cast the class to the interface for setting the handler.除了 InvocationHandler 外,还有许多其他创建代理的方法.一种方法是使用 MethodDelegation ,它更灵活,通常更快,并且允许您按需调用超级方法.也可以使用 MethodCall 或 Forwarding 工具应用转发工具.您可以在相应的类javadoc中找到详细信息.Beyond the InvocationHandler, there are many other ways to create a proxy. One way would be using MethodDelegation which is more flexible, often faster and allows you to invoke a super method on demand. A forwarding insrumentation can also be applied using a MethodCall or a Forwarding instrumentation. You can find detailed information in the respective classes javadoc. 这篇关于如何使用ByteBuddy创建动态代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 1403页,肝出来的..
09-06 22:41