代码如下,在Main方法中我调用静态方法:
public class Main {\n public static void main(String[] args) {\n MyFactory.getSomething();\n System.out.println("over"); \n }\n}\nRun Code Online (Sandbox Code Playgroud)\n在静态方法中,让主线程等待,然后由demo线程唤醒。但是主线程没有唤醒,我不知道为什么。
\nimport java.util.concurrent.TimeUnit;\n\npublic class MyFactory {\n private static Object lock = new Object();\n\n static{\n init();\n }\n\n private static void init(){\n new Thread(()->{\n try {\n // make this thread run after main thread\n TimeUnit.SECONDS.sleep(3);\n System.out.println("task run...");\n synchronized (lock){\n lock.notifyAll(); // notify main thread\n }\n } catch (InterruptedException e) {\n throw new RuntimeException(e);\n }\n },"demo-thread").start();\n\n synchronized (lock){\n try {\n System.out.println("waiting...");\n …Run Code Online (Sandbox Code Playgroud) 假设我们使用的是 OpenJDK 20。官方文档说:
平台类加载器负责加载平台类。平台类包括 Java SE 平台 API、它们的实现类以及由平台类加载器或其祖先定义的特定于 JDK 的运行时类。平台类加载器可以用作
ClassLoader实例的父类。
同时,我从Oracle规范中了解到,Bootstrap ClassLoader加载启动JVM所需的核心运行时类。我还了解到 Platform ClassLoader 不会将任何内容加载到空程序中:
jshell> ClassLoader.getPlatformClassLoader().getDefinedPackages();
$1 ==> Package[0] { }
Run Code Online (Sandbox Code Playgroud)
但它从 Java SE加载一些java.sql包,例如:
jshell> java.sql.Connection.class.getClassLoader()
$2 ==> jdk.internal.loader.ClassLoaders$PlatformClassLoader@27fa135a
jshell> ClassLoader.getPlatformClassLoader().getDefinedPackages()
$3 ==> Package[1] { package java.sql }
Run Code Online (Sandbox Code Playgroud)
有些则不然(例如,作为java-se 模块java.util.logging的同一个子模块):
jshell> java.util.logging.ConsoleHandler.class.getClassLoader();
$4 ==> null
Run Code Online (Sandbox Code Playgroud)
我是否正确地指出 Platform ClassLoader 加载开发人员可能需要的公共类型的系统模块?如果是这样,哪些特定的包(或者更好地问,模块?)属于这个“可能”?
提前致谢。
我想知道是否可以获得运行给定类的实例的句柄.触发此问题的特定问题是由于许多正在运行的线程而无法正常退出的应用程序.
是的,我知道你可以守护theads,然后他们不会阻止应用程序退出.但它确实让我想知道这是否可行.我最接近的是classloaders(protected!)findLoadedClass,尽管你必须通过自己的类加载器来执行此操作.
在相关的说明中,这是分析工具如何管理跟踪对象句柄?通过运行自己的自定义类加载器?还是有一些我看不到的好看的狡猾方式?
在Java中,Class.forName是否会返回null,或者如果无法找到类,它是否会抛出ClassNotFoundException或NoClassDefFoundError?
我正在尝试为tomcat实现自定义类加载器.我的第一次尝试产生了类强制转换异常(显然,tomcat尝试将我的加载器强制转换为org.apache.catalina.loader.WebappLoader).好吧,我扩展了WebappLoader并将catalina.jar添加到我的构建路径中.
现在我准备好部署(我想).我收到这个错误:
严重:Catalina.start:LifecycleException:start :: java.lang.NoClassDefFoundError:org/apache/catalina/loader/WebappLoader
Tomcat带有catalina.jar来运行,所以我99.9%肯定它已经加载到tomcat中.我通过检查/server/lib/catalina.jar验证了这一点,它包含了apache WebappLoader.此外,正如预期的那样,手动链接另一个catalina.jar会产生一大堆问题.
我糊涂了.任何提示都会很热.
谢谢!
更新:有趣的是,tomcat6上的相同内容(扩展WebappLoader;在tomcat5.5上运行)仍会导致ClassCastException.听起来像执行演员表的类是使用与加载我的类的装载器不同的加载器加载的.我不知道我怎么能控制它,除非在某处可能有另一个丢失的tomcat配置?对tomcat6有什么想法吗?
我正在研究一个swing项目,使用maven2(来自命令行)和eclipse(没有maven集成).所以,我通过maven eclipse插件(mvn eclipse:eclipse)生成eclipse项目,在eclipse中导入它,并完成我的所有工作.
我的问题是:当我在eclipse中运行我的应用程序(作为Java应用程序)时,我找不到我的src目录中的任何资源.挖掘我的问题的信息,我从另一个问题进入这个答案.所以,我比较了以下说明的输出:
MyClass.class.getResource("/").getPath();
MyClass.class.getProtectionDomain().getCodeSource().getLocation().toString();
Run Code Online (Sandbox Code Playgroud)
那些分别给了我以下输出:
$ {workspace_loc}/$ {my_project}/target/test-classes/file:/ $ {workspace_loc}/$ {my_project}/target/classes /
检查上面的位置,我可以看到前者是空的,而另一个包含我所有编译的类和资源.所以,我得出结论,类加载器正在错误的地方寻找我的资源.所以,我想我有三个问题:
更新:我已经改变了我的代码,所以不是调用MyClass.class.getResource(...)或者MyClass.class.getResourceAsStream(...),我现在正在使用ClassLoader.getSystemResource(...)和ClassLoader.getSystemResourceAsStream(...).通过这种方式,在日食中一切正常.我只是不知道为什么.有什么暗示吗?
..我有一个应用程序(.war),它有一个插件系统,其中每个可插入插件都是一个带有.jar依赖项的.jar.在webapp中,通过管理Web界面,使用ClassLoader加载插件,该类"加载".jar及其依赖项.但问题是,例如,2个插件A和B可能有一个或多个公共依赖项(commons-io.jar,commons-collection.jar,...)...所以通常我不应该加载更多一次.jar已经被另一个插件加载,或者已经存在于webapp本身 - > WEB-INF/lib /所以,我想知道是否有一种方法可以不加载另一个时间.jar已经存在了通过webapp或其他插件加载如果可能,我该怎么做!
实际上,无论可用的解决方案是什么,我只想避免类加载器问题.
注意:每个插件都是一个.zip文件,其中包含以下体系结构
插件名称/
- code/
- A.class
- B.class
- ...
- lib/
- commons-io.jar
- log4j.jar
- ....
- description.xml
- version.txt
Run Code Online (Sandbox Code Playgroud)
目录代码中的每个.class文件都由类加载器加载,插件的lib /目录中的每个.jar也被加载.
但通常,我不应该重新加载.jar"commons-io.jar"中存在的类,如果它已经存在的话......
我希望我已经足够清楚了,先谢谢你的关注和帮助.
我在Adnroid 2.2 SDK上,无法在MultiUserChat类中获取我的静态块来执行.我试图强制加载它
try
{
String qual = MultiUserChat.class.getName();
ClassLoader.getSystemClassLoader().loadClass(qual);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
它总是击中捕获块.'qual'获得该类的有效名称......它可以是什么?
我注意到scala符合jsr 223 https://issues.scala-lang.org/browse/SI-874 ...但是它能够像GroovyScriptEngine那样做吗?我考虑为我们的产品添加一个scala脚本支持,以便开发人员可以编写将从java应用程序加载的小型应用程序/组件/类(理想情况下可以重新加载).我使用GroovyScriptEngine用于groovy应用程序/组件/类,但我在Scala中找不到类似的东西.
Basicaly我需要用scala东西来提供一个目录,它会加载所有可以访问(或至少一个)java应用程序的scala类.
你能给我一些指示吗?这是我们使用Scala的唯一方法.
我正在学习加载Java类的过程,遇到一些困惑。
我知道加载Java类时,当前classLoader不会直接加载Java类,它将委托给其父classLoader(一个递归过程),直到其父不能加载此类为止。
问题是?当前的classLoader是什么? 引导程序?延期?应用程式?
如何获取当前的classLoader?而且我知道有一个API:
xxx.Class.getClassLoader();
Run Code Online (Sandbox Code Playgroud)
但我不确定返回值是否为currentClassLoader。我认为应该是实际加载此java类的classLoader 。
为了更详细地描述我的问题,我将举一个例子。
我在博客中获得了以下内容。
ThreadContextClassLoader用于处理Java SPI,接口在Java中定义
core lib并由Bootstrap ClassLoader加载,第三方实现这些接口,然后由AppClassLoader加载jar
解决方案:传统的classLoader无法处理这种情况,因为它无法发现第三方jar当我们在核心库中使用第三方工具时。
我能理解的大多数上述方法都使我感到困惑:例如,接口CoreA和类CoreB在Java中core lib,应由Bootstrap ClassLoader加载,而AImpl是由第三方实现的A的实现,并应由以下方法加载AppClass加载器。
代码段如下:
public Interface CoreA{
void add();
}
public Interface AImpl implements CoreA{
void add(){};
}
public class B{
public void demo(){
a …Run Code Online (Sandbox Code Playgroud)