加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – OSGi WeavingHook示例

发布时间:2020-12-14 17:44:08 所属栏目:Java 来源:网络整理
导读:有没有人使用OSGi 4.3编织钩服务的例子? AspectJ,ASM,JavaAssist呢?有人真的使用OSGi WeavingHooks吗? OSGi Core 5.0.0第56.2节中的例子简单地省去了实际的编织,并说“最后的编织作为练习留给读者”. 我的目标是: 创建一个我可以放在字段(基元或对象)上
有没有人使用OSGi 4.3编织钩服务的例子? AspectJ,ASM,JavaAssist呢?有人真的使用OSGi WeavingHooks吗?

OSGi Core 5.0.0第56.2节中的例子简单地省去了实际的编织,并说“最后的编织作为练习留给读者”.

我的目标是:

>创建一个我可以放在字段(基元或对象)上的注释(@MyAnnotation).
>创建一个org.osgi.framework.hooks.weaving.WeavingHook编写具有该注释的类
>使用加载时编织来切换具有该注释的字段的任何修改
> fire EventAdmin事件,字段被修改.
>动态更新从WeavingHook到捆绑线束到EventAdmin捆绑包.

我的问题主要是#3.

我正在尝试使用AspectJ WeavingAdaptor进行编织,但是由于我们期望构造函数中的java.net.URL [] aspectURL可以是jars或目录它可以在文件系统上找到,而不是捆绑.另外,我不知道如何处理由编译器生成的任何新类,通过回调到GeneratedClassHandler的acceptClass(String name,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 AOP,但是我希望这可以用于任何bundle,而不仅仅是通过Spring或Blueprint实例化的bean.此外,Equinox编织似乎没有使用OSGi编织钩规格,我不想被绑定到Equinox.如果其他工作效果更好,我没有问题.

参考类似的问题:Is it possible to do bytecode manipulation when using OSGi?

更新:

最终的结果是我刚刚使用Equinox Aspects并将其安装到Karaf.是3个捆绑包,一个库和一个系统属性.我会使用它,直到它们更新到我们OSGi编织,或者我编写自己的OSGi编织钩子来使用类似于Equinox Aspects的AspectJ代码.我不喜欢使Equinox Aspects工作所需的编织指示器,因为它在要编织的包中的AspectJ RT上引入了需求捆绑/重新输出或导入包.该依赖关系应该在捆绑包之外动态添加和建议.

解决方法

看看Apache Aries的代理模块的 ProxyWeavingHook.它直接使用ASM库修改字节码,使其更低级别.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读