ByteBuddy变基,合成类型和OSGi

问题描述 投票:1回答:1

我为字节伙伴开发了以下拦截器:

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 ...

java osgi byte-buddy
1个回答
0
投票

您可以应用的一个技巧是不使用重定基,而是在代理加载期间创建自己的类加载器,其中新类(及其所有合成类)被加载到具有多个父级的类加载器中:

© www.soinside.com 2019 - 2024. All rights reserved.