作为一个开源 Lifecycle Framework API 提供者,我想尽我所能,以隐式的方式隐藏内部设计来提供 Lifecycle API,这样会给 API Client 带来更多的便利。
预计会避免对核心 Java 应用程序和 Java EE 应用程序进行配置,但实际情况是我正在使用 java 命令 -javaagent:${path}/Lifecycle.jar 选项在类加载时启用我自己的 ClassFileTransformer。
经过一番搜索,发现了一些不清楚的方向。我需要一些 Java Guy 来总结和指导我们。
- agentmain vs premain
与指定的运行环境集成,例如 Glassfish 的 ByteCodePreprocessor,它有以下方法来进行字节码转换:
public byte[] preprocess(String classname, byte[] classBytes);
我对这些方向的困惑:
- 对于Core Java Application,看来我们可以修改启动类的main方法来适配agentmain解决方案。还有其他选择吗?
- 对于使用 JavaEE Container,例如 Glassfish,我可以使用 ByteCodePreprocessor 来修改类字节码,但是我需要创建一些新的类,但我不知道在哪里存储这些新的类文件,或者如何设计或应用一个新的ClassLoader 在预处理类文件期间加载新创建的类文件。
(BTW Lifecycle API 将遵循元驱动的风格,与没有 EntityManager 接口的 JPA 非常接近,目前大部分只是 Annotations 和 CallbackContext 接口和 LifecycleEvent 接口。)