问题标签 [java-assist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
357 浏览

java - Java将字段和方法添加到已编译的类并使用类加载器重新加载

我想在 Spring Boot 应用程序中加载的已编译 Java 类中添加字段及其 getter/setter。我能够使用 JavaAssist 和 ASM 修改该类。但问题是它不允许我在修改后重新加载类,因为它已经被加载了。我试图编写一个扩展 java.lang.ClassLoader 的类,但没有调用自定义类加载器。另外,我检查了明确指出的 java 的 Instrumentation API

重新转换可能会改变方法体、常量池和属性。重新转换不得添加、删除或重命名字段或方法,更改方法的签名或更改继承。这些限制可能会在未来的版本中取消。在应用转换之前,不会检查、验证和安装类文件字节,如果结果字节有误,此方法将引发异常。

你能告诉我如何实现这一目标吗?我对运行时与编译时修改持开放态度。如果你能分享一些很好的例子。子类化可能不是一个选项,因为此类将由我们没有任何控制权的第三方 jar 使用,并且此 jar 将使用类池中的类。另外,你能告诉我如何使用自定义类加载器吗?

技术

我想在下面实现

尝试使用以下方法加载类时

例外

没有被调用的自定义类加载器

0 投票
0 回答
107 浏览

java - 线程“主”java.lang.IllegalStateException 中的异常:无法转换具有名称的类

我正在使用 JAVA 1.8,Javaassist 版本为 3.24.0,power mock 1.7.4。当我在@PrepareForTest 中包含一个类时,我遇到了这个问题。这里 MainClass 类取决于 serverCommunicator.class 实例。

我写的上述方法的测试用例是这样的:

因此,当我在 @PrepareForTest 中添加 serverCommunicator.class 时,它会在线程“main”java.lang.IllegalStateException 中显示以下错误。异常:无法转换名称为 ServerCommunicator 的类。原因:空

0 投票
0 回答
344 浏览

android - Android:引起:java.lang.RuntimeException:java.io.IOException:无效常量类型:19 at 5

我们正在将 Hotfix Robust 库集成到我的应用程序中。在运行应用程序时,我们遇到了以下错误。我们已将版本设置compileOptionsJava8版本,并尝试通过添加Javaassist版本3.27.0-GA但没有运气。

0 投票
0 回答
200 浏览

java - 如何使用 Instrumentation 的 Java API 捕获 HTTP 请求和响应?

我正在编写一个-javaagent使用 Java 的 Instrumentation API(例如 javassist/ )来捕获 HTTP 请求和响应asm。我可以在方法周围插入代码,但是如果该方法即将进行 HTTP 调用并捕获 HTTP 请求详细信息、响应代码,我该如何捕获?

0 投票
0 回答
20 浏览

java - Javaassist 捕获块 e.printStackTrace

我们有以下 Javaassist 代码将 printStackTrace() 添加到存在于 3rd 方类中的 catch 块

但是,当我们运行时 - 它会引发以下错误 javaassist.CannotCompileException: [source error] no such class: e

我们在这里缺少什么?

提前致谢!

0 投票
0 回答
160 浏览

java - Java 对象在次要 gc 后不必要地提升到老年代导致内存碎片问题

我们的应用程序面临一个奇怪的内存泄漏问题。

GC 配置:ParNew + CMS

某些类型的对象过早升级为老年代并导致严重的碎片问题。

  1. 幸存者有足够的空间容纳这些物品
  2. 老化阈值为 15 个周期,并没有基于此发生过早升级。

关于这些对象:这些是使用 Java 辅助库创建的代理对象。

由于对此类对象进行了不必要的提升,老年代很快就被污染了,并且正在发生严重的碎片化。

我们的观察:

  1. 对象仅在伊甸园中分配。没有尺寸相关的问题。
  2. 对象的作用域非常小,可以在下一次次要 gc 中进行 GC。
  3. 为了确保这一点,我们在finalize()中打印了一些记录器,并观察到范围在请求后立即结束。就在第一次次要 GC 之后。

注意: finalize() 只是为了跟踪目的而添加的。即使没有 finalize() 旧代促销也会发生。

  1. 在一次次要 gc 之后:
  • 期望是该对象将被清除。
  • 但是该对象正在升级为老年代。在多个堆转储的帮助下,我们能够跟踪对象升级到老年代。
  1. 所有这些对象都在老一代中积累,并由老一代 GC 进行 GC。
  2. 此行为仅在生产服务器中可见,在测试环境中不可重现。

请建议如何进一步进行并解决此问题。

另一个有趣的更新:使用 G1GC,当使用 G1GC 时,对象会被正确清除。使用 finalize() 方法检查,在第一个循环之后,对象变得无法访问。在下一个小循环之后,对象不在那里。对于 G1GC,问题不存在。

0 投票
0 回答
31 浏览

eclipse - PowerMock、Mockito 和 javassist 版本冲突

当我试图在这个版本上运行我的单元测试时,我遇到了一个问题。注意:问题仅存在于 Eclipse 中,当我尝试在更高的环境上本地运行时,它工作正常。并且一些不使用 closeablehttpclient 的测试用例运行良好。

PowerMock - powermock-mockito-release-full-1.6.4-full,powermock-module-testng-1.6.6 javaassist - javassist-3.24.0-GA java8

堆栈跟踪-

0 投票
1 回答
92 浏览

java - 带有 Javassist 3.24.0-GA 的 Powermock 1.6.4 产生 javassist.CannotCompileException: by javassist.bytecode.BadBytecode

我正在使用带有 javaassist 的以下版本的 powermock 和 junit。除了少数为使用 CloseableHttpClient 的类编写的测试用例外,大多数测试用例都运行良好。我尝试了 powermock + javaassist 的不同组合,但似乎没有任何效果。我的项目是遗留项目,因此不使用 Maven。

代码-

堆栈跟踪-

0 投票
0 回答
103 浏览

java - 运行使用 Java 11 编译的 Java 8 项目时,Maven MyBatis 测试失败

我有一个使用 Java 8 构建/编译的多模块 Maven 项目。

我最近刚刚安装了 OpenJDK 11,以便将项目升级到 Java 11。在实际更新任何组件等之前,我想将我的 Java 8 项目编译为 Java 8,但使用 Java 11 编译器。

我更新了我的父母pom.xml

我能够毫无问题地编译所有源代码。

当我去运行我的测试时mvn test

我的理解是,通过使用<release>标签,编译器不仅会针对指定的版本进行字节码兼容性,而且还会使用正确的 JDK 包。这似乎在某种程度上完成了它的工作,因为编译工作正常,但测试的运行却没有。

0 投票
0 回答
18 浏览

java - JNI_CreateJavaVM 和 JavaAssistBridge 导致错误

我使用 JNI_CreateJavaVM 创建了一个 JVM,它工作得很好(Windows 10,64 位,C++ 和 jre 1.8 JVM 一样是 64 位)......但是,如果启用了 JavaAssistBridge,它会在JavaAccessBridge-64.dll 因为我没有后者的 PDB 文件,所以很难理解缺少什么(如果有的话..)......

有人有任何线索吗?