![](/img/trans.png)
[英]How to do "--add-modules" with dynamically created layer in JPMS?
[英]How to get ClassLoader of newly created JPMS layer?
也許這是一個簡單的問題,但仍然可以找到方法。 假設我使用以下代碼創建圖層
ModuleFinder finder = ModuleFinder.of(moduleCPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("module-c"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer myLayer = parent.defineModulesWithOneLoader(cf, scl);
據我對myLayer
了解, myLayer
一個類加載器。 在不知道myLayer
模塊中可以包含哪些類的情況下,如何獲得對該類加載器的引用, myLayer
加載器具有對myLayer
引用?
創建ModuleLayer
,每個Module
都將映射到ClassLoader
。
ModuleLayer
根據Configuration中的模塊圖和將每個模塊映射到ClassLoader的函數創建一個圖層。
ModuleLayer
沒有ClassLoader
概念,因為不能保證每個Module
都具有相同的ClassLoader
。 相反, ClassLoader
與每個單獨的Module
相關聯,您可以通過Module.getClassLoader()
。
但是,由於您使用的是ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader)
1 ,因此可以保證每個Module
都具有相同的ClassLoader
。 這意味着您可以從ModuleLayer
任何Module
獲取ClassLoader
,並將其視為“ ModuleLayer
ClassLoader
”。
ModuleLayer layer = parent.defineModulesWithOneLoader(...);
ClassLoader loader = layer.modules().iterator().next().getClassLoader();
請注意,在以下情況下,此功能將無法正常工作:
ModuleLayer
為空(沒有Module
)。
iterator().next()
將拋出NoSuchElementException
。 defineModulesWithManyLoaders(Configuration,ClassLoader)
1創建ModuleLayer
Module
都有自己的ClassLoader
。 defineModules(Configuration,Function)
創建ModuleLayer
defineModules(Configuration,Function)
並且Function
不會每次都返回相同的ClassLoader
。
Module
到ClassLoader
任何組合。 同樣,每個ClassLoader
可能具有不同的父級。 定義ModuleLayer
時,此方法提供了最大的靈活性。 1.方法defineModulesWithOneLoader
和defineModulesWithManyLoaders
是兩個預定義用例中defineModules
便捷方法; 每個Module
具有相同的ClassLoader
和每個Module
具有自己的ClassLoader
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.