我为字节伙伴开发了以下拦截器:
public class SecurityInterceptor() {
@RuntimeType
public static Object intercept(
@SuperCall Callable<Object> supercall,
@This Object target,
@Origin Method method,
@AllArguments Object[] args) {
// Check args and annotations ...
Object obj = supercall.call();
// Post-process obj content ...
}
}
拦截器的注册如下:
Unloaded<Object> unloaded = new ByteBuddy()
.rebase(type, classFileLocator)
.method(ElementMatchers.isAnnotatedWith(Secured.class))
.intercept(MethodDelegation.to(SecurityInterceptor.class))
.make();
wovenClass.setBytes(unloaded.getBytes());
并且这发生在OSGi的WeavingHook
内部。问题在于,使用@SuperCall
进行基础调整会更改原始代码,例如]
public User getUser(final String s) throws Exception { return SecurityInterceptor.intercept((Callable)new UsersServiceImpl$auxiliary$xhbBRSr4(this, s), (Object)this, UsersServiceImpl.cachedValue$nlgHrwy3$sn5qca3, new Object[] { s }); }
其中
UsersServiceImpl$auxiliary$xhbBRSr4
是由字节伙伴生成的综合类:
class UsersServiceImpl$auxiliary$xhbBRSr4 implements Runnable, Callable { private UsersServiceImpl argument0; private String argument1; @Override public Object call() throws Exception { return this.argument0.getUser$original$6ve6X5gN$accessor$nlgHrwy3(this.argument1); } @Override public void run() { this.argument0.getUser$original$6ve6X5gN$accessor$nlgHrwy3(this.argument1); } UsersServiceImpl$auxiliary$xhbBRSr4(final UsersServiceImpl argument0, final String argument2) { this.argument0 = argument0; this.argument1 = argument2; } }
其中
UsersServiceImpl
是要编织的类。
因此,我需要在UsersServiceImpl
包的类空间中添加所有这些综合类(或通常使该类中的“可访问”综合类)。这可能吗?
我为字节好友开发了以下拦截器:公共类SecurityInterceptor(){@RuntimeType公共静态对象拦截器(@SuperCall Callable
您可以应用的一个技巧是不使用重定基,而是在代理加载期间创建自己的类加载器,其中新类(及其所有合成类)被加载到具有多个父级的类加载器中: