使用OSGi时是否可以进行字节码操作?

Esk*_*ola 9 java aop osgi bytecode-manipulation

我正在创建一个应用程序服务器,在其中我需要使用一些字节码操作(例如,将自定义equalshashCode方法插入到带注释的类中@Entity).现在我给JVM一个Java代理(-javaagent选项),它使用ASM进行字节码转换.

我一直在考虑使用OSGi,但我不知道它是否允许我进行必要的字节码操作.

  1. 使用OSGi时是否可以进行字节码操作?怎么样?
  2. bundle是否有可能声明自己,它需要一些字节码操作才能工作?例如,应用程序服务器要求操作它自己的一些核心类.
  3. 是否可以指定其他一些bundle需要一些字节码操作,而没有那个bundle知道它?例如,必须操纵在服务器上运行的所有应用程序,但应用程序不需要知道它.
  4. bundle是否有可能声明自己,所有依赖它的bundle必须是字节码操作的?这将使我很容易声明所有依赖于包含@Entity注释的API包的人都必须被操纵.

ran*_*ath 7

OSGI 4.3添加了WeavingHook,它允许您使用您选择的字节代码操作进行字节代码操作.我在我的一个项目中使用JavaAssist并且效果很好.


Pat*_*off 3

1) 是的,可以在 OSGi 中进行字节码操作。其方式与标准 java 略有不同,您需要使用此处描述的扩展器模式http://www.osgi.org/blog/2007/02/osgi-extender-model.html。我相信 Eclipse 在他们的春分方面项目中使用了它:http://www.eclipse.org/equinox/incubator/aspects/Spring DM肯定使用这种模式来自动配置 osgi dm 模块。

2)这取决于您使用的扩展模式。这就是 spring 扩展器的工作方式,在平台启动配置文件之前,在包的 META-INF/spring 文件夹中查找配置文件。

3)同样,这取决于您定义的扩展器。

4)我相信这是可能的,因为在启动包之前,它必须解析并启动依赖项,然后您的扩展程序可以分析包依赖项并启动字节码操作。