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

时间:2009-02-18 23:18:20

标签: java aop osgi bytecode-manipulation

我正在制作an application server并且在其中我需要使用一些字节码操作(例如,将自定义equalshashCode方法插入到使用@Entity注释的类中。现在我给JVM一个Java代理(-javaagent选项),它使用ASM进行字节码转换。

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

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

4)我相信这是可能的,因为在启动bundle之前,它必须解决并且依赖关系已经开始,然后你的扩展器可以分析bundle依赖关系并开始字节码操作。