java - Byte Buddy 和 OSGi 编织钩子
问题描述
我想将 Byte Buddy 与 OSGi 编织钩一起使用。
例如,可以像这样将 Javassist 与 OSGi 编织钩子一起使用:
//... 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 处理 wovenClass?我看到我可以像这样得到字节码:
byte[] classBytes = new ByteBuddy()
.subclass(AClass.class)
.name("MyClass")
.method(named("theMethod"))
.intercept(FixedValue.value("Hello World!"))
.make()
.getBytes();
wovenClass.setBytes(classBytes);
但我看不到如何提供 wovenClass 字节码作为 Byte Buddy 的输入。我需要类似的东西:
new ByteBuddy().rebase(wovenClass.getBytes())...
解决方案
该rebase
方法被重载并接受 aClassFileLocator
作为第二个参数。您可以通过提供显式映射直接提供类字节:
ClassFileLocator.Simple.of(wovenClass.getTypeDescription().getName(), wovenClass.getBytes())
推荐阅读
- google-app-maker - 谷歌应用程序制造商如何输入密码类型(隐藏文本)?
- python - 如何使用在 pySpark 的子模块中定义的 UDF?
- r - 是否有 R 函数/方法使您能够将自定义函数应用于分组数据帧的每一组?
- java - Maven 清洁包,关于“Invalid PropertyValueException”未找到符号的错误
- angularjs - KendoUI for AnfularJS Grid 工具栏自定义按钮样本可见性
- javascript - 选中该按钮时,将类添加到单选按钮的父级(具有特定类)
- javascript - 如何在纱线项目中的 JS repl 中加载库?
- regex - Powershell Regex 匹配 IP 和两个通配符
- c-preprocessor - _LIBCPP_INLINE_VISIBILITY 是什么?
- php - 使用 https 时 PHP readfile() 损坏的图像问题