有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在使用OSGi时可以进行字节码操作吗?

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

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

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

共 (2) 个答案

  1. # 1 楼答案

    OSGi4.3添加了WeavingHook,允许您使用自己选择的字节码操纵器进行字节码操纵。我在我的一个项目中与JavaAssist一起使用它,效果非常好

  2. # 2 楼答案

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

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

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

    4)我相信这是可能的,因为在启动捆绑包之前,必须先解决它并启动依赖关系,然后扩展器才能分析捆绑包依赖关系并启动字节码操作