gpt4 book ai didi

java - Byte Buddy 和 OSGi Weaving Hook

转载 作者:行者123 更新时间:2023-11-30 01:56:32 24 4
gpt4 key购买 nike

我想将 Byte Buddy 与 OSGi weaving hook 一起使用。

例如,可以将 Javassist 与 OSGi 编织 Hook 一起使用,如下所示:

//... other imports
import org.osgi.framework.hooks.weaving.WeavingHook;
import org.osgi.framework.hooks.weaving.WovenClass;

@Component (immediate = true)
public class MyWeavingHook implements WeavingHook {

@Activate
public void activate(ComponentContext ctx) {
System.out.print("Activating demo weaving hook...");
}

@Override
public void weave(WovenClass wovenClass) {
System.out.println("Weaving hook called on " + wovenClass.getClassName());
if (wovenClass.getClassName().equals("DecoratedTestServiceImpl")) {
try (InputStream is = new ByteArrayInputStream(wovenClass.getBytes())) {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass(is);
ctClass.getDeclaredMethod("ping").setBody("return \"WAIVED\";");
wovenClass.setBytes(ctClass.toBytecode());
} catch (Exception e) {
e.printStackTrace();
}
}

}

}

如何使用 Byte Buddy 处理 wedClass?我发现我可以像这样获取字节码:

byte[] classBytes = new ByteBuddy()
.subclass(AClass.class)
.name("MyClass")
.method(named("theMethod"))
.intercept(FixedValue.value("Hello World!"))
.make()
.getBytes();
wovenClass.setBytes(classBytes);

但我不知道如何提供 wedClass 字节码作为 Byte Buddy 的输入。我需要类似的东西:

new ByteBuddy().rebase(wovenClass.getBytes())...

最佳答案

rebase 方法已重载,并接受 ClassFileLocator 作为第二个参数。您可以通过提供显式映射来直接提供类字节:

ClassFileLocator.Simple.of(wovenClass.getTypeDescription().getName(), wovenClass.getBytes())

关于java - Byte Buddy 和 OSGi Weaving Hook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299064/

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