有人有使用OSGi 4.3+织布钩服务的例子吗?那么AspectJ,ASM,JavaAssist呢?有人真的在使用OSGi WeavingHooks吗?
OSGi Core5.0.0中的示例56.2简单地忽略了实际的编织,并说“最后的编织是留给读者的练习”。
我的目标是:
我的问题主要是3号。
目前,我正在尝试使用AspectJ WeavingAdaptor进行编织,但我在将方面库导入它时遇到了问题,因为它希望构造函数中的java.net.URL[] aspectURL是jars或目录,它可以在文件系统上找到而不是包。另外,我不知道如何处理编织器通过回调acceptClass(String,bytes[])方法生成的任何新类。
也许WeavingAdaptor不是我开始编织的合适地方?还是我不应该使用AspectJ?
MyAnnotation.java
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}MyWeavingHook.java
public class MyWeavingHook implements WeavingHook {
public class MyWeavingClassloader implements WeavingClassLoader {
private Bundle b;
public MyWeavingClassLoader(Bundle b) {
this.b = b;
}
void acceptClass(java.lang.String name, byte[] bytes) {
//no way to get this back into the woven classes bundle classloader?
}
URL[] getAspectURLs() {
//how do I get a handle to my aspect library that AspectJ can understand?
}
}
public void weave(WovenClass myclass) {
Bundle b = Framework.getBundle(MyWeavingHook.class);
WeavingClassLoader wc = new WeavingClassLoader(b);
WeavingAdaptor w = new WeavingAdaptor(wc);
if (shouldWeave(myclass))
myclass.setBytes(w.weave(myClass.getBytes()));
//should catch exceptions
}
private boolean shouldWeave(WovenClass myclass) {
//not sure of the best logic to pick which classes to weave yet
}
}MyAspect.aj
privileged aspect MyAspect {
after() : set(* *) && @annotation(MyAnnotation) {
//send EventAdmin event
}
}MyTestClass.java
public class MyTestClass {
@MyAnnotation
private int myField;
public void doSomething() {
//do stuff with myField
}
}我可以使用Spring,但我希望它能适用于任何捆绑包,而不仅仅是通过Spring或Blueprint实例化的bean。此外,春分织布似乎还没有使用OSGi编织钩子规范,我不想被绑在春分。如果其他事情更好的话,我不介意放弃AspectJ。
提到一个类似的问题:当使用OSGi时,可以做字节码操作吗?
更新:
最终的结果是,我只是使用Equinox方面并将其安装到Karaf中。是3个包、一个库和一个系统属性。我将使用它,直到他们将其更新给我们OSGi编织,或者编写自己的OSGi编织钩子来使用类似Equinox方面的AspectJ代码。我不喜欢让Equinox方面工作所需的编织指示符,因为它在捆绑包中引入了需求包/再导出或导入包。应该在包之外动态地添加和通知此依赖项。
发布于 2013-04-08 08:54:55
看看Apache的代理模块中的ProxyWeavingHook。它直接使用ASM库修改字节码,从而更低级别。
发布于 2013-05-24 06:52:39
WeavingAdaptor希望您的WeavingClassLoader是从URLClassLoader派生出来的,因此这两个可用的构造函数最终基本上都会执行相同的操作。签出http://www.slideshare.net/mfrancis/bytecode-weaving,看看如何使用BundleWiring来获得对类路径URL的访问。您可以向wovenClass.getDynamic‘’Imports()添加AspectJ运行时包,以避免直接的AspectJ引用。BundleWiring也是为WeavingAdaptor提供AspectJ urls的方式。
我认为无法支持来自acceptClass的新类,因为织入钩子声明动态导入只能在编织方法中使用。
https://stackoverflow.com/questions/15555545
复制相似问题