gpt4 book ai didi

java - ByteBuddy rebase 、合成类型和 OSGi

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:16 32 4
gpt4 key购买 nike

我为 byte-buddy 开发了以下拦截器:

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 进行 rebase 会改变原始代码

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 是由 byte-buddy 生成的合成类:

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 包的类空间中(或者通常使合成类从该包“可访问”)。这可能吗?

最佳答案

最后我使用了不同的方法:

Unloaded<Object> unloaded = new ByteBuddy()
.redefine(type, classFileLocator)
.visit(Advice.to(SecurityAdvice.class)
.on(ElementMatchers.isAnnotatedWith(Secured.class)))
.make();

public class SecurityAdvice {
@Advice.OnMethodEnter
private static void enter(@Advice.AllArguments Object[] args) {
//...
}

@Advice.OnMethodExit
private static void exit(@Advice.Return(typing = Typing.DYNAMIC) Object value) {
//...
}
}

这只会改变原始类的字节码,而不会引入额外的合成类型。

关于java - ByteBuddy rebase 、合成类型和 OSGi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58388214/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com