标签: dynamic-class-loaders

系统包如何访问系统包?

我正在探索过去几周如何实施OSGI.我知道每个bundle都使用自己的类加载器来加载它的类.作为我调查的一部分,我理解每个bundle的类加载器的父级是null,即引导类加载器.

System.out.println("ClassInBundle class is loaded by "+ClassInBundle.class.getClassLoader());
System.out.println("ClassInBundle parent class is "+ClassInBundle.class.getClassLoader().getParent());
Run Code Online (Sandbox Code Playgroud)

bundle samplebundle中上面代码的输出是

ClassInBundle class is loaded by com.sample.bundle.samplebundle [34]
ClassInBundle parent class is null
Run Code Online (Sandbox Code Playgroud)

对于bundle中的导入,它维护一个packagename => classloader的映射,以便它可以将请求委托给正确的类加载器

Bundle SB = felix.getBundleContext().getBundle(0);
List<BundleWire> sbwires=SB.adapt(BundleWiring.class).getRequiredWires(null);
List<BundleWire> li=bundle.adapt(BundleWiring.class).getRequiredWires(null);
for(BundleWire i : li){
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是

[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (osgi.wiring.package=com.test.packag) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.8.0)(!(version>=2.0.0))) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework.wiring)(version>=1.2.0)(!(version>=2.0.0))) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.ee; (&(osgi.ee=JavaSE)(version=1.6)) -> [org.apache.felix.framework [0](R …
Run Code Online (Sandbox Code Playgroud)

osgi dynamic-class-loaders equinox apache-felix embedded-osgi

5
推荐指数
1
解决办法
73
查看次数

使用 URLClassLoader 加载 .class 文件

我知道这个问题之前已经被问过:

如何使用URLClassLoader加载*.class文件?

但由于缺乏示例,我不太明白。我目前正在开发一个项目,并尝试加载用户给定的 .class 对象,这些对象可以位于计算机上的任何目录中。

//Create URL to hash function class file
URL url_hashFunctionPath = new URL("file:///" + _sHashFunctionFilePath);

//Packet URL to a URL array to be used by URLClassLoader
URL[] urlA_hashFunctionPath = {url_hashFunctionPath};

//Load URL for hash function via a URL class loader
URLClassLoader urlCl_hashFunctionClassLoader = new URLClassLoader(urlA_hashFunctionPath);

//Load user hash function into class to initialize later (TEST: HARD CODE FOR NOW)
m_classUserHashClass = urlCl_hashFunctionClassLoader.loadClass(_sUserHashClassName);
Run Code Online (Sandbox Code Playgroud)

最后一行给了我一个 ClassNotFoundException,根据我的实验&理解用户给定的类函数必须位于类路径中?

PS:第一次发帖,有不懂的地方欢迎指正。

//解决方案

我在 [WillShackleford][1] 的慷慨帮助下得出的解决方案,该解决方案可以在给定的文件路径中加载 .class 文件。有关更多信息,请参阅代码及其给出的注释。

//The absolute file path to …
Run Code Online (Sandbox Code Playgroud)

java urlclassloader dynamic-class-loaders

4
推荐指数
1
解决办法
7772
查看次数

Java:Extensions Class Loader在Java 13中从哪里获取类?

我已经找到的所有文档都提到了“ jre / lib / ext”文件夹,但是在我的JRE 13安装中不存在。

我猜在Java 8(可以在jre / lib / ext中看到罐子)和Java 13之间的某个地方,它们移动了,但是我无法确定何时以及如何完成。

有人可以根据扩展类当前所在的位置来详细说明新JRE的情况吗?

java classloader dynamic-class-loaders classloading java-13

3
推荐指数
1
解决办法
63
查看次数

Java中的默认类加载器是否将所有内容保留在内存中或保留在文件系统中?

我想知道您是否有一个jar,可以动态地加载到正在运行的程序中,那么jar中的所有内容(类,资源)是否都存储在VM内存中的某个位置?

这样,每次您需要访问类或文本资源文件时(例如,通过getClass()。getResourceAsStream),都可以将其从内存中快速拉出,而不必再次访问文件系统中的jar?即您可以在此之后删除该jar。

抱歉,如果我问的是错误的问题,请改成解释类加载器过程的问题,因为我可能会误解它,尤其是对于jar中打包的资源。谢谢。

java jar classloader dynamic-loading dynamic-class-loaders

2
推荐指数
1
解决办法
1353
查看次数

当这些类可能正在使用时,如何成功卸载这些类?

我在我的应用程序中内置了重新加载类的功能。但是,我需要澄清类加载器的行为。

让我解释一下我所知道的,然后提出问题......

我所做的是提供一个由自定义类加载器加载的特殊 jar。然后在 jar 的引导过程中,创建了一堆 spring bean,并且实现某些接口的 bean 被注册以供中央应用程序使用。

现在我在应用程序中启动一个使用这些新类的进程。我可以成功卸载“jar”,更改 jar 中的类并重新加载,然后我就得到了更改。用类加载器的说法来说,卸载意味着使加载类的类加载器无法访问 - 这会导致该类加载器加载的任何类都无法访问,从而有效地卸载。

但是,据我所知,一旦虚拟机加载了该类,它就会将其存储在某个共享空间中,因此不必再次加载它。

我遇到的问题是,有时卸载和重新加载新类不起作用。旧班级仍然存在。按理说,如果我卸载一个类加载器(即使类加载器无法访问)并且该类加载器中的某个类当前正在使用(存在该类型的对象),则无法卸载该类。

这是真的?实践中似乎也是如此。

如果是这样,我如何成功卸载类加载器无法访问时正在使用的类。例如,我可以在每个类上放置一个弱引用,以便我可以检测到类何时无法访问,并在类无法访问时采取行动吗?(但不确定我可以采取什么行动)。

更新响应@Kayaman

我的用例是,我拥有核心应用程序,然后根据客户的要求,我可以加载实现核心应用程序中已知接口的不同类(以便可以访问它们)。然后核心应用程序启动使用这些类的各种进程。这样做的一大优点是,我可以更新这些插件类,而无需进行大量的重新部署,并且每个客户并不需要其中的每一个。当我想加载其中之一的新版本并且当前版本正在使用时,问题就出现了。按理说这是不可能的。

结论

@Kayamam 非常感谢您的咨询。这非常有帮助。这在一定程度上规范了我的想法。结论是,无论我使用什么技术,在虚拟机的现有方式下,您都无法重新加载当前存在强可达对象的类。对于我的一些重新加载,我可以控制这些对象,因为我可以在卸载和重新加载之前使它们无法访问,但对于其他类,我不能这样做......这就是我的问题所在。我需要做的是围住我希望重新加载的类的对象,以便在重新加载这些对象的类时可以暂停使用它们的进程。

java classloader dynamic-class-loaders

2
推荐指数
1
解决办法
5863
查看次数

java中class.forName方法的布尔初始化参数

虽然我阅读了文档,但我无法理解加载类时这两行 java codee 之间的区别:

Class<?> cls = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror", false, enginClassLoader);


Class<?> cls = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror", true, enginClassLoader);
Run Code Online (Sandbox Code Playgroud)

这里的布尔参数在文档中解释如下:

initialize 如果为真,类将被初始化。请参阅 Java 语言规范的第 12.4 节。

就我而言,即使我使用带有 false 参数的代码,它仍然有效。所以我想知道什么时候应该是真的?

java classloader dynamic-class-loaders

2
推荐指数
1
解决办法
550
查看次数

在 Java 中,新建或增强类加载器的用例是什么?

在 Java 中,我们知道类加载器是一个 JVM 系统,它将类加载到 JVM 中执行。当我运行一个简单的 Java 类时,它会被运行时系统加载和执行。在这里,我没有对类加载做任何事情。但是我可以看到,有很多项目在编写自定义类加载器或增强现有的类加载器。请让我知道需要类加载器增强或新类加载器的生产时间用例。

java jvm classloader dynamic-class-loaders java-8

2
推荐指数
1
解决办法
71
查看次数

如何在运行时从下载的jar文件中加载未知类?

我正在构建一个客户端服务器应用程序.在运行时,客户端应用程序从服务器应用程序加载jar文件并存储它.我将客户端和服务器应用程序作为jar文件运行.我现在想加载这个下载的jar文件中包含的类.

例如,我有一个接口A和一个实现A的类B.客户端应用程序不知道类B,它的名称甚至它的存在.客户端应用程序启动后,客户端应用程序下载一个包含jar文件的jar文件,其内容为:server/package/B.class,其中server和package是文件夹.

现在,客户端应用程序应该从下载的jar文件中加载此类B,其代码如下:

URL downloadURL = downloadFolder.toURI().toURL();
URL[] downloadURLs = new URL[] { ruleSetFolderURL };
URLClassLoader loader =
    new URLClassLoader(downloadURLs);
Class tmp = loadClass(server.package.B);
Run Code Online (Sandbox Code Playgroud)

但后来我ClassNotFoundException在最后一行得到了一个.我首先要提取jar文件吗?jar文件中的文件夹结构类似于服务器应用程序的bin目录中的文件夹结构.

java classloader dynamic-class-loaders

1
推荐指数
1
解决办法
2039
查看次数