9

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

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

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

2 回答 2

7

OSGI 4.3 添加了WeavingHook,它允许您使用您选择的字节码操纵器进行字节码操纵。我在我的一个项目中将它与 JavaAssist 一起使用,效果很好。

于 2011-10-25T19:55:59.227 回答
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)我相信这是可能的,因为在启动包之前,它必须解决并启动依赖项,然后您的扩展程序可以分析包依赖项并启动字节码操作。

于 2009-02-19T02:48:36.927 回答