问题标签 [classloading]
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.
java - 使用 Bytebuddy 动态创建类和方法
我是 bytebuddy 的新手,我想动态创建一个类并使用 byte buddy 执行如下代码。
我FormulaAPI
已经定义了类,它有方法 ->evaluate(..)
并getSum(..)
在其中定义。
我想用byte buddy动态创建一个叫Formulas的类,动态构造方法formula1234(..)
和方法里面的代码。
甚至可以使用字节伙伴构造 if else 语句吗?
请您举例说明如何使用 byte buddy 动态生成此代码。任何帮助表示赞赏。
java - 第一次使用类时jvm如何检查类是否加载
问题
当 jvm 运行以下代码时
我们知道 jvm 将启动 MyObject 的加载类,但我想知道 jvm 是如何知道 MyObject 未加载的。
动机
我想知道,因为如果 jvm 运行这些代码
我们知道没有#1,MyObject 会被Main 类的classloader 加载,但是有了#1,MyObject 的类会在#2 加载,jvm 是如何判断的呢?
java - Wildfly 模块类加载
我遇到了一个关于 Wildfly 类加载的相当奇怪的问题。我有一个 java-ee webapp,结构如下:
war 和 jar 都需要一些 spring 类才能正常运行。我定义了一个包含相关类的 spring 模块。在jboss-deployment-structure
我有一个部分如下:
启动我的 web 应用ClassNotFoundException
程序后,我在部署战争档案时得到一个。如果我添加一个额外的部分
有用。
我的理解是,主部署部分的每个模块也应该在所有子部署中可见。
任何人都可以对这个问题有所了解吗?
java - 类加载与初始化:Java 静态最终变量
Example.java
使用.java
当我运行java -verbose:class Use
, 并给出输入时,1
输出10
就是常i
数值。但是Example
类还没有加载。但是,当我输入 as 时2
,只有 Example
类被加载到 JVM 中,如详细输出所示,然后执行 Example 内的静态块,并且j
初始化然后打印的值。
我的查询是:如果对于输入,1
即当一个类的静态最终(常量)值Example
在另一个类中被请求时,那么如果在此之前该类从未加载到 JVMUse
中,那么从哪里获取该常量值?Example
静态 final 何时以及如何i
初始化并存储到 JVM 内存中?
byte-buddy - 在创建大量 ByteBuddy 类时,我是否需要获取任何类型的锁?
我正在创建几个 ByteBuddy 类(使用DynamicTypeBuilder
)并加载它们。ExecutorService
这些类的创建和它们的加载以相对简单的顺序在单个线程(主线程;我自己不产生任何线程,也不向 a 提交任何东西)上发生。
我注意到连续多次在单元测试中运行它会产生不同的结果。有时可以很好地创建和加载类。其他时候,当随后使用生成的字节码时,我会从生成的字节码中得到错误(通常在我使用的一般区域withArgumentArrayElements
,如果重要ArrayIndexOutOfBoundsErrors
的话;等等;其他时候,这一切都很好(使用相同的输入))。
这感觉像是一种竞争条件,但正如我所说,我没有产生任何线程。因为我没有使用线程,所以只能使用 ByteBuddy(或 JDK)。我不确定那会在哪里。DynamicTypeBuilder.make()
在使用 and 创建和加载类时,我应该使用 ByteBuddy 同步机制getLoaded()
吗?也许某种类解析正在发生(或没有发生!)在后台线程或某事上make()
,我不小心以某种方式阻止它完成?也许如果我要立即使用这些类(我是)我需要提供不同的TypeResolutionStrategy
?我很困惑,应该很清楚,并且无法弄清楚为什么具有相同输入的单线程程序会生成在运行之间表现不同的生成类。
我加载这些类的模式是:
- 尝试使用加载(通常不存在的)类
Class#forName(name, true, Thread.currentThread().getContextClassLoader())
。 - 如果(何时)失败,请创建 ByteBuddy 生成的类并使用通常的 ByteBuddy 配方加载它。
- 如果失败,那只是因为其他线程可能已经创建了该类。在这个单元测试中,没有其他线程。无论如何,如果这里发生故障,我重复第 1 步,然后如果加载失败则抛出异常。
除了这些之外,我还应该采取哪些特定于 ByteBuddy 的步骤?
java - 限制类加载类中的类使用
我想*.class
从实现接口的文件系统加载文件。
但我只想加载依赖于java.util.*
包中的类的类文件?这可能吗?如果可以,怎么办?我的意思是如果是动态创建的,它可以检测到非法类的使用吗?使用本机图像时这也可能吗?
提前致谢。
java - 如何识别将在 java 类文件中使用的类
如何*.class
通过解析编译*.class
文件来识别将在 java 文件中使用的 java 类?
提前致谢。
java - Hibernate/Spring 的类加载泄漏
我们有 Spring/Hibernate-Tests 目前会产生类加载泄漏。由于技术原因,springcontext 是根据测试方法启动的。随着 spring 上下文的初始化,一个休眠会话也被初始化。
我们可以观察到加载的类的数量正在稳步增加。使用 JProfiler 检查后,我们发现任何休眠会话的实例化都会触发所有实体类对象的负载。由于我们有三位数的休眠实体,这会导致元空间和压缩类空间的巨大膨胀。
问题是:为什么同一个类加载器一次又一次地加载相同的类,却没有意识到类对象已经加载了?
编辑:场景说明
此问题是作为软件现代化项目的一部分发生的,其中旧应用程序的功能被移植到应用程序的弹簧管理部分。在生产期间这工作正常 - 应用程序服务器初始化 spring 上下文(因此休眠),遗留核心通过一些静态访问器访问它。
在测试阶段,我们必须将遗留测试框架与 spring 核心集成。由于技术原因(旧的测试框架有些古怪),我们必须为每个测试重新建立 spring-context,而不是每个测试类。由于测试集中有相当多的测试,这最终会导致压缩类空间内的 OOME。
由于测试实际上使用了数据库连接,因此每个测试都会初始化一个休眠会话。我们使用的是 Spring 5.2.13 和 Hibernate 5.4.29。
java - 在 maven mojo 中加载项目类
我正在尝试在执行 maven mojo 期间加载项目类。
不幸的是,这个操作失败了,因为类加载器缺少一个引用的类。环顾四周,我已经发现Maven mojo 插件从托管项目加载类的方法,而Maven 插件无法加载类
我结合了这两种方法,最终得到以下代码:
加载失败的类是接口“org.bson.codecs.Codec”的实现,它包含在“org.mongodb:bson”中,通过依赖隐式导入:
这个依赖对另一个jar(范围:提供)有依赖,包含提到的接口,可以在maven依赖树中看到:
当我查看创建的类加载器的类路径元素时,我看到 mongodb-driver-sync.jar 包含在内,但由于它声明了“org.mongodb:bson”依赖项,其范围提供了接口仍然不在类路径。
所以,最后一个问题是:如何加载一个从“间接”依赖项引用类的类?
makefile - 无法找到或加载主类 org.antlr.Tool
我正在尝试交叉编译 CVC4,调用后make
出现以下错误:
但是,如以下命令所示,可以找到该类:
任何想法为什么在此make
过程中无法加载类?我已经在CLASSPATH中添加了对应的jar。