问题标签 [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 - 保留不同类路径之间的继承
假设我为开发人员提供了一个服务提供者接口来扩展/实现。我的应用程序在其类路径中包含此 SPI,并在运行时加载包含此 SPI 实现的其他库。将此版本称为 SPI 1.0。人们针对此版本 1.0 SPI 进行开发,一切正常。
现在,假设我想改变这个 SPI。我采用了几个抽象类,并添加了已实现但仍可被覆盖的方法。将此版本称为 1.1。当主应用程序运行 1.1 版时,针对 1.0 版开发的库仍然可以工作吗?继承结构还保留吗?添加的方法具有实现,因此永远不会缺少代码。但是,父母和孩子之间的纽带被打破了吗?我不明白库之间的继承是如何工作的,所以我不知道这会如何影响事情。
android - Android拦截类加载
是否可以拦截Android的默认类加载并有条件地避免加载一个类?
我的动机是拦截Android的默认类加载过程并避免根据条件加载类,例如
我不打算更改加载类的位置,而是要对可以在什么时间点加载哪些类进行细粒度控制,我称之为Strict class loading。在这种情况下,在满足某些条件之前不应该加载的任何类都不应该被加载。我正在寻找拦截类加载以实现此目的的方法。
java - Tomcat 8第一个请求处理第一个请求很慢
我正在开发一个高性能的 java 应用程序。我部署在 Tomcat 8 中。第一个请求处理很慢,即处理需要 800 毫秒。之后,每个请求都在 50 毫秒内快速处理。我认为初始请求类加载需要时间。我的要求是即使是第一个请求,性能也应该很高。
我的问题是:
1)如何处理这种情况?
2)服务器重启后传递样本请求是空闲的方式吗?
java - Java:如何在不知道包名的情况下扫描类?
我正在编写一个 API,它提供基于类注释的功能。API 将被导入,因此它不知道客户端的包。所以问题是:如何在不知道包名的情况下扫描类?
我找到了这些方法:
但它只返回包的一个子集。
但 is 不接受通配符,例如*
or .
。
编辑对@Rakesh 的回答
java - 为什么不执行静态块
根据 java doc,静态块在类初始化时执行。
谁能告诉我为什么当我运行下面的代码时没有执行静态块?
jakarta-ee - ClassCastException:org.dom4j.DocumentFactory 无法在 WildFly 13 中转换为 org.dom4j.DocumentFactory
我正在经历
在部署到 WildFly 13.0.0.Final 期间,应用程序在我指定的 Payara 4.1.2.181 和 5.181 上部署良好
在WEB-INF/glassfish-web.xml
. 我假设类转换异常是由类加载问题引起的(因为由不同的类加载器加载的两个相同的类被认为是不相同的)<class-loader delegate="false"/>
,因此我假设为 WildFly 指定等效项是 KISS 解决方案。
关于在不同的 Java EE 服务器中(分层)使用类加载器有很多术语(因为 Java EE 没有指定它),我开始阅读 WildFly 的概念,但是我将在 GlassFish/Payara 中表达我正在寻找的内容条款:避免类加载委托,并首先从部署的 WAR 中获取依赖项/搜索和加载类。
JBoss 论坛中关于 GlassFish 未发生的类转换异常的臃肿线程提供了一个不适用于我的应用程序的解决方案。
有趣的是,甚至不排除所有org.dom4j.DocumentFactory
使应用程序在 Java EE 服务器之间有效地不可移植的传递依赖项都有帮助。
java - 确定性类加载 - 加载类的控制线程
我正在研究 JVM 中确定性故障再现的研究项目,并且正在努力使不同应用程序运行之间的类加载具有确定性。我的意思是我想确保总是同一个线程加载一个在以前的运行中加载它的类。
假设我在第一次运行时记录了哪个线程加载了给定的类(这是最简单的部分)并将该信息存储在某处。然后我想控制没有其他线程将在任何后续应用程序运行中加载该类(例如,通过在它们导致加载类事件之前停止它们)。
虽然我设法通过字节码修改或 JVMTI 完成了大部分事情,但我不确定如何解决这个问题,因为加载是由 JVM 控制的,而且显然没有字节码说before load class
,也不是正确的 JVMTI 事件。
我愿意接受任何建议,无论多么“怪异”。因此,即使使用非公开的 JVM 内部也可以;C/C++ 或 Java。虽然不知道在哪里挂钩。
java - 编译时和运行时java中类加载器的顺序
我java.lang.String
在java中创建了具有限定名称的类。
在主类中,我添加了以下代码。
代码编译得很好。当我运行代码时,它失败并出现以下错误。
我必须了解它java.lang.String
是由引导类加载器在运行时从 rt.jar 文件加载的。
所以,我认为类加载的顺序在编译时和运行时应该是不同的。您能否在编译时和运行时给出类加载的顺序。
java - 静态变量集,但不可获取 - 类加载问题(可能?)
这对我来说很奇怪:
1)我有课
在我的服务器(WAS liberty 中的 J2EE 应用程序)启动期间正确设置了此类变量名称 - 我想在整个服务器生命周期中缓存此数据。
2) 但是当我点击一个最终调用执行 getter 的代码的 URL 时:
谁能想到一个可能的原因?也无法调试,我很沮丧。
为了更多地说明我的问题,让我展示我的项目结构:
耳朵
CommonJar
战争1 战争2
我的 Data.java 在 CommonJar 中。此 Data.java 在由 web.xml 中注册的侦听器触发的服务器启动期间在 WAR1 中初始化,从这里我看到它已设置,并且我看到使用 Data.getName() 的非空值。--这是我的我原来的帖子中的第 1 步。
然后我在 WAR2 中有一个宁静的 HelloWorld 服务。当我调用这个 HelloWorld 服务时,我看到 Data.getName() 返回 null。- 这是我在原始帖子中的第 2 步。甚至不要想像语法类型的容易错误的东西,因为它不是那样的。
我的理论是:似乎 Data.java 在步骤 1 中由 WAR1 中的类加载器加载,然后在我的步骤 2 中由 WAR 2 加载,步骤 2 加载了一个空的 Data 类。
为了验证这个理论是否正确,我将 Data.java 初始化步骤移到了 WAR2 中,(我再次看到它被设置并且我看到使用 Data.getName() 的非空值),不同之处在于当我调用进入这个 HelloWorld 服务,我看到 Data.getName() 返回预期的非空值。这一步就是我所说的故障排除突破,因为它似乎表明我的理论是正确的。(但我无法通过在我的实际问题修复中移动代码来解决问题)
那么问题是如何修复以及如何直观地查看哪个类由哪个类加载器加载以及何时加载?同样基于 WAS Liberty 文档,默认的类加载器将是 parentsfirst,这意味着 Data.java 应该由父级(在本例中为 EAR)加载,所以我不应该首先遇到我的问题。
任何人,请指导如何进一步查看问题并解决它?谢谢。
java - 排除 JVM Jar 打开问题
我有一个小型 Java 程序“Test.java”,它依赖于在同一目录中的单独 jar 文件中找到的类“TestLib”。
“项目”结构:
Test.java 和 testlib.jar 是 stub 工件,它们重现了我在更大的应用程序中看到的类路径问题。Test.java 所做的只是从 testlib.jar 实例化一个类,然后退出:
我的测试 jar 有问题的测试库类:
(jar 包含许多其他类和 meta-inf 文件,此处省略)
我可以编译这个小项目:javac Test.java -classpath .:testlib.jar
我尝试使用 command 运行它java -classpath .:testlib.jar Test
,并获得输出:
它找不到“TestLib”!
有趣的是,当我将-verbose
标志添加到我的 java 调用时,我可以看到它甚至从未打开我的库 jar 以在那里查找 TestLib:
是什么决定了 JVM 是否打开一个 jar 文件来查找丢失的类?是否有任何 META-INF 或其他 jar 内容阻止 jar 被 JVM 打开?我应该采取哪些步骤来解决为什么在运行时找不到“TestLib”?