草庐IT

ClassLoader

全部标签

java - 如何从 Java 获取 jar 文件的主类名称?

我想使用URLClassLoader加载和执行外部jar文件。从中获取“Main-Class”的最简单方法是什么? 最佳答案 我知道这是一个老问题,但至少对于JDK1.7,之前提出的解决方案似乎不起作用。出于这个原因,我发布了我的:JarFilej=newJarFile(newFile("jarfile.jar"));StringmainClassName=j.getManifest().getMainAttributes().getValue("Main-Class");其他解决方案对我不起作用的原因是因为j.getManifes

java - 有和没有 getClassLoader 的 getResourceAsStream 有什么区别?

我想知道以下两者之间的区别:MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");和MyClass.class.getResourceAsStream("path/to/my/properties");谢谢。 最佳答案 来自Class.getResourceAsStream()的Javadoc:Thismethoddelegatestothisobject'sclassloader.Beforedelegation,anabsolute

java - 更改类加载器

我正在尝试在运行时切换类加载器:publicclassTest{publicstaticvoidmain(String[]args)throwsException{finalInjectingClassLoaderclassLoader=newInjectingClassLoader();Thread.currentThread().setContextClassLoader(classLoader);Threadthread=newThread("test"){publicvoidrun(){System.out.println("running...");//approach1Cl

java - 如何检查一个类是否被初始化?

您可能会问,我为什么要这样做-这是因为我正在使用一个类(来自外部库),该类在其静态初始化程序中执行某些操作,我需要知道它是否已完成。我查看了ClassLoader,但没有找到任何有用的东西。有什么想法吗? 最佳答案 您可以使用ClassLoader.findLoadedClass()方法。如果它返回null,则不会加载该类。这样您就不会加载尚未加载的类。WARNING:这段代码在这里不起作用,在系统类加载器中,findLoadedClass()是protected,您需要用自己的类加载器覆盖它。检查下面的链接Onthesametop

java - 从 sbt 程序集运行 uber jar 会导致错误 : Could not find or load main class

我有一个使用sbtassembly插件打包为uber-jar的spark作业。build.sbt指定一个可运行的main作为生成的uber-jar的目标mainClassinassembly:=Some("com.foo.Bar")正确创建程序集后,运行预期的命令:java-jarassembly.jar结果Error:Couldnotfindorloadmainclasscom.foo.Bar使用另一种方法,如java-cpassembly.jarcom.foo.Bar会给出相同的错误消息。然后,我将uber-jar的内容提取到一个新目录中。我可以看到我的com/foo/目录和Bar

java - 正确使用 Classloader(尤其是在 Android 中)

我阅读了一些关于类加载器的文档,但我仍然不确定在哪里以及为什么需要它们。AndroidAPI说:Loadsclassesandresourcesfromarepository.Oneormoreclassloadersareinstalledatruntime.Theseareconsultedwhenevertheruntimesystemneedsaspecificclassthatisnotyetavailablein-memory.所以如果我理解正确的话,可以有很多负责加载新类的类加载器。但是系统如何决定使用哪个呢?在什么情况下开发人员应该实例化一个新的类加载器?在Androi

java - 使用 ClassLoader 加载文件

这个问题困扰了我一段时间。我必须在我的Java应用程序中加载几个文件,到目前为止我唯一的工作方式如下所示:URLhsURL;if(System.getProperty("os.name").toLowerCase().contains("windows")){hsURL=newURL("file:/"+System.getProperty("user.dir")+"/helpsets/helpset.hs");}else{hsURL=newURL("file://"+System.getProperty("user.dir")+"/helpsets/helpset.hs");}但这又丑

java - 修补或覆盖核心 Java 10 类的实现

JFX中有一个错误,通常在计算屏幕坐标时出现https://bugs.openjdk.java.net/browse/JDK-8194727和https://bugs.openjdk.java.net/browse/JDK-8190400我已将问题追溯到GeneralTransform3D的实现,它是javajfx运行时的一部分。我已向Oracle提交错误报告,但在它被接受、修复并发布之前,我需要一种方法来修复我的应用程序。在java8中,我能够创建一个包含该类的固定版本的jar,并将其安装在lib/ext文件夹中。这似乎有效,JFX实现使用了我的实现而不是它自己的实现。在java10

Java ClassLoader委托(delegate)模型?

在ClassLoader上调用loadClass()时,ClassLoader是先检查类是否已加载,还是立即将此检查委托(delegate)给其父级ClassLoader?JavaAPI说:Whenrequestedtofindaclassorresource,aClassLoaderinstancewilldelegatethesearchfortheclassorresourcetoitsparentclassloaderbeforeattemptingtofindtheclassorresourceitself.但是JavaReflectioninAction一书中有一个关于类加

java - 具有多个应用程序的 Tomcat 上的类加载器行为

在Tomcat5.5服务器上,我将一个类放在系统类路径中(并修改catalina.bat以选择它),或者如果我将类放在共享库目录中。现在,如果我有两个不同的应用程序使用相同的类,但它们的WEB-INFlib/classes目录中没有该类,它们将使用该类的相同实例。我理解类加载器将委托(delegate)给它的父类加载器来查找类的概念,如果它找不到它,所以在这种情况下,因为类不存在于WEB-INF/classes或WEB-INF/lib中WebAppX类加载器将分别尝试共享类加载器、公共(public)类加载器和系统类加载器。然而,这对我来说似乎有点奇怪,因为两个不同的应用程序可以使用这