首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSGi WeavingHook示例

OSGi WeavingHook示例
EN

Stack Overflow用户
提问于 2013-03-21 18:39:05
回答 2查看 4.2K关注 0票数 12

有人有使用OSGi 4.3+织布钩服务的例子吗?那么AspectJ,ASM,JavaAssist呢?有人真的在使用OSGi WeavingHooks吗?

OSGi Core5.0.0中的示例56.2简单地忽略了实际的编织,并说“最后的编织是留给读者的练习”。

我的目标是:

  1. 创建一个我可以放置在字段(原语或对象)上的注释(@MyAnnotation)。
  2. 创建一个用该注释编织类的org.osgi.framework.hooks.weaving.WeavingHook
  3. 使用加载时间编织在任何修改字段时使用该注释
  4. 激发字段被修改的EventAdmin事件。
  5. 动态地更新从WeavingHook到EventAdmin包的绑定。

我的问题主要是3号。

目前,我正在尝试使用AspectJ WeavingAdaptor进行编织,但我在将方面库导入它时遇到了问题,因为它希望构造函数中的java.net.URL[] aspectURL是jars或目录,它可以在文件系统上找到而不是包。另外,我不知道如何处理编织器通过回调acceptClass(String,bytes[])方法生成的任何新类。

也许WeavingAdaptor不是我开始编织的合适地方?还是我不应该使用AspectJ?

MyAnnotation.java

代码语言:javascript
复制
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

MyWeavingHook.java

代码语言:javascript
复制
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

代码语言:javascript
复制
privileged aspect MyAspect {
    after() : set(* *) && @annotation(MyAnnotation) {
      //send EventAdmin event
    }
}

MyTestClass.java

代码语言:javascript
复制
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方面工作所需的编织指示符,因为它在捆绑包中引入了需求包/再导出或导入包。应该在包之外动态地添加和通知此依赖项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-08 08:54:55

看看Apache的代理模块中的ProxyWeavingHook。它直接使用ASM库修改字节码,从而更低级别。

票数 3
EN

Stack Overflow用户

发布于 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的新类,因为织入钩子声明动态导入只能在编织方法中使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15555545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档