gpt4 book ai didi

java - 有没有关于加载时间字节码转换而不在java命令行中指定javaagent选项的解决方案

转载 作者:行者123 更新时间:2023-11-30 04:08:14 26 4
gpt4 key购买 nike

作为一个开源Lifecycle Framework API提供商,我想尽最大努力以隐式的方式隐藏内部设计来提供Lifecycle API,这样会给API Client带来更多的便利。

预计会避免对核心 Java 应用程序和 Java EE 应用程序进行配置,但实际情况是我正在使用 java 命令 -javaagent:${path}/Lifecycle.jar 选项在类加载时启用我自己的 ClassFileTransformer时间。

经过一番查找,发现了一些不明确的方向。我需要一些 Java Guy 来总结和指导我们。

  1. agentmain 与 premain
  2. 与指定的运行环境集成,例如Glassfish的ByteCodePreprocessor,它有以下方法来执行字节码转换:

    public byte[] preprocess(String classname, byte[] classBytes);

我对这些方向的困惑:

  1. 对于核心Java应用程序,我们似乎可以修改启动类的main方法来适应agentmain解决方案。还有其他选择吗?
  2. 对于使用JavaEE容器,比如Glassfish,我可以使用ByteCodePreprocessor来修改类字节码,但是我需要创建一些新的类,但我不知道在哪里存储这些新的类文件,或者如何设计或在预处理类文件期间应用新的 ClassLoader 来加载新创建的类文件。

(BTW Lifecycle API 将遵循元驱动的风格,这与没有 EntityManager 接口(interface)的 JPA 非常接近,目前大多数只是 Annotations 和 CallbackContext 接口(interface)以及 LifecycleEvent 接口(interface)。)

最佳答案

嗯,我能想到的唯一其他方法是使用可以在运行时注册的自定义类加载器。这就是像 Powermock 这样的框架的方式做他们的繁重工作。然而,这也需要一些设置,但可以通过编程来完成。

只要您的框架具有明确定义的入口点,并且只要所有代码都从应用程序内运行,您就可以应用自定义类加载器来检测所有加载的类。

但是,这对于已加载的类不起作用。 (您可以破坏父优先模式,但这可能会在框架外部的实例上引发 ClassCastException。)

避免这种情况需要您覆盖同样冗长的系统类加载器。为了完整起见,这里是 ClassLoader.getSystemClassLoader 的 javadoc 的摘录:

If the system property "java.system.class.loader" is defined when this method is first invoked then the value of that property is taken to be the name of a class that will be returned as the system class loader. The class is loaded using the default system class loader and must define a public constructor that takes a single parameter of type ClassLoader which is used as the delegation parent. An instance is then created using this constructor with the default system class loader as the parameter. The resulting class loader is defined to be the system class loader.

在此自定义类加载器中,您始终可以返回检测的类。

difference between agentmain and premain前者是在将代理附加到正在运行的 JVM ( via the attach API ) 时调用,而后者是在 JVM 启动时在命令行上指定代理时调用。在运行时注册代理实际上可能是您的一个解决方案。我链接的博客文章对此提供了很好的描述。

关于java - 有没有关于加载时间字节码转换而不在java命令行中指定javaagent选项的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com