我正在用ByteBuddy代理我的对象,一切都很好。当我用@Test注释一个方法时,应该用另一种方式代理它们。所以我决定将我的InvocationHandler一分为二。到目前为止还不错。
但现在,当我想添加private,@Test注释的方法时,它们不会被代理/拦截。只有公共方法才会被拦截。有什么想法吗?
// return created proxy instance
@SuppressWarnings("unchecked")
Class<T> proxy = (Class<T>) byteBuddy
.subclass(clazz)
.implement(Proxy.class)
.defineField("_origin", Object.class, Visibility.PRIVATE)
.defineConstructor(Visibility.PUBLIC)
.withParameter(Object.class)
.intercept(MethodCall.invoke(clazz.getDeclaredConstructor()).andThen(FieldAccessor.ofField("_origin").setsArgumentAt(0)))
.name(clazz.getSimpleName() + "Proxy")
.method(ElementMatchers.isAnnotatedWith(Test.class))
.intercept(InvocationHandlerAdapter.of(testInvocationHandler))
.method(ElementMatchers.isDeclaredBy(AdditionalTest.class))
.intercept(InvocationHandlerAdapter.of(testInvocationHandler.getAdditionalTestInvocationHandler()))
.method(ElementMatchers.isDeclaredBy(Proxy.class)).intercept(InvocationHandlerAdapter.of(testInvocationHandler.getAdditionalTestInvocationHandler())).make()
.load(clazz.getClassLoader()).getLoaded();
如果定义自定义方法,匹配器将不会应用于这些方法。您需要指定Implementation
才能应用这些匹配器。或者,您可以使用其他方法创建一个类,然后通过创建另一个代理来拦截此类型。