- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为一个开源Lifecycle Framework API提供商,我想尽最大努力以隐式的方式隐藏内部设计来提供Lifecycle API,这样会给API Client带来更多的便利。
预计会避免对核心 Java 应用程序和 Java EE 应用程序进行配置,但实际情况是我正在使用 java 命令 -javaagent:${path}/Lifecycle.jar 选项在类加载时启用我自己的 ClassFileTransformer时间。
经过一番查找,发现了一些不明确的方向。我需要一些 Java Guy 来总结和指导我们。
与指定的运行环境集成,例如Glassfish的ByteCodePreprocessor,它有以下方法来执行字节码转换:
public byte[] preprocess(String classname, byte[] classBytes);
我对这些方向的困惑:
(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/
在我的项目中,我想分两个阶段转换字节码。顺序很重要。 首先,我需要更改方法定义 然后调用方法的方式 例如 从 String hello() 更改定义至 String hello(String s) 从
我通过 使用 javaagent(带有 Javaassit) premain(String agentArgs, Instrumentation inst) 方法,我很好奇为什么 ClassFileT
我们编写了一个 java 代理,其中使用 java.awt.TrayIcon 提供某种 GUI。当我们使用此代理时,例如Tomcat,我们遇到以下问题: 用户使用 shell 脚本启动 Tomcat
此调用有效。 java -ea -cp ~/Documents/workspace/export/testProject1/"*"-javaagent:/home/jack/Documents/wor
我正在编写一个 javaagent 来监视应用程序。它启动服务器并显示计算的指标。 如何配置我的代理,以便每当应用程序关闭时,都会执行一些清理操作,然后代理退出?我研究过关闭 Hook ,但它们需要访
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我正在尝试使用一个名为 LoggerAgent 的 javaagent 来获取一些 Java 应用程序日志的详细信息。但是我收到了 ClassNotDefinedException: Exceptio
我正在尝试使用以下方法启动我的网络应用程序: java -jar application.jar 我已经嵌入了 Jetty 并使用了 Maven 程序集来构建所需的 jar,这一切都工作得很好,但是我
我像这样设置我的javaagent: -javaagent:/usr/pkg/tomcat/lib/aspectjweaver-1.7.3.jar 但它不起作用,所以我有兴趣查看日志。如果我想获取日志
我有一个要求,即当客户端连接到服务器时,服务器必须查明客户端是否使用 -javaagent: 运行?服务器和客户端都是用 java 编写的。有没有办法让服务器获取客户端正在运行的 java 选项? 最
是是否可以拦截方法调用并使用丰富的参数调用此拦截的方法?我的情况是我必须拦截例如logger.info("foo"),丰富消息参数,例如“foo.bar”并调用 logger.info(“foo.ba
如何检查 javaagent 是否已注入(inject) JVM 或禁用 javagent 的附加?由于安全原因,我试图防止我的应用程序在运行时被修改。 我知道如何防止 javaagent 在启动时加
我试图制作简单的 java 分析器并使用 javaagent 来监视内存使用情况。这是我的 javaagent 实现的一部分: import java.lang.instrument.ClassFil
您好,我正在尝试向我的 javaagent 添加调试点。我有两个单独的类用于 premain 方法和转换方法。为代理类添加的日志按预期打印。但在 ClassFileTransformer 类中,它会打
我一直在尝试从检测方法中获取值。使用 $1, $0 获取参数值和当前对象变量效果很好。但现在我想从该方法中使用的对象中获取值。 举个例子,假设我正在检测 org.h2.jdbc.JdbcPrepare
当我尝试使用 IBM JDK 运行简单的 jMockit/JUnit 测试时,出现以下异常。 java.lang.ExceptionInInitializerError at java.lan
我使用 ASM 为 javaagent 实现了一个 ClassFileTransformer。因为它有一些bug,我想为它写一个JUnit测试用例。我该怎么做? 使用我认为的伪代码: // Have
我正在尝试开发一个 javaagent,它可以在 asm-4 的帮助下检测代码。现在我遇到了一个非常基本的问题,javaagent 的类加载器没有看到 asm 依赖项,因此失败了。我是否必须提供一个包
我正在尝试使用 java.lang.instrument API 添加对 java.lang.Object 构造函数的静态方法调用。我知道我的基础知识是正确的,因为如果我调用 System.gc()
在实现真正的东西之前,我试图创建一个简单的 Java 代理程序。我无法让它运行。显然我有某种配置或类路径问题。再多的寻找和尝试也没有给我带来问题。 如果我运行: java -cp ./demoAgen
我是一名优秀的程序员,十分优秀!