gpt4 book ai didi

clojure - Clojure 中的 Class/forName 不尊重 ContextClassLoader?

转载 作者:行者123 更新时间:2023-12-02 14:16:08 24 4
gpt4 key购买 nike

我被 REPLed 到一个正在运行的服务中,并且有一个 var 指向一个类加载器,通过该类加载器加载了一个插件(安装了 my.package)。

REPL 使用的 DynamicClassLoader 不包含我希望与之交互的插件;尽管有此限制,我希望能够使用从插件加载的类。

以下作品:

=> (.loadClass plugin-classloader "my.package.MyClass")
my.package.MyClass

...而以下内容则不然(显式覆盖线程上下文类加载器):

=> (do
(.setContextClassLoader (Thread/currentThread) plugin-classloader)
(Class/forName "my.package.MyClass"))
ClassNotFoundException my.package.MyClass java.net.URLClassLoader$1.run (URLClassLoader.java:202)

...这也没有(显式覆盖线程上下文类加载器 clojure.lang.Compiler/LOADER 引用):

=> (let [dcl (clojure.lang.DynamicClassLoader. plugin-classloader)]
(.setContextClassLoader (Thread/currentThread) dcl)
(with-bindings* {clojure.lang.Compiler/LOADER dcl}
(eval '(pr-str (Class/forName "my.package.MyClass")))))
ClassNotFoundException my.package.MyClass  java.net.URLClassLoader$1.run (URLClassLoader.java:202)

...这也不是:

=> my.package.MyClass
CompilerException java.lang.ClassNotFoundException: my.package.MyClass, compiling:(NO_SOURCE_PATH:0)

设置时 Class.forName() 不应该使用线程上下文类加载器吗?我正在尝试对第三方代码进行一些调用,以进行内省(introspection)魔法;即使应该设置线程上下文类加载器,相关工具也会失败并出现 ClassNotFoundExceptions。

<小时/>

在我显式设置上下文类加载器的情况下,堆栈跟踪表明 Clojure 的 DynamicClassLoader(而不是插件类加载器变量中的 BundleClassLoader)正在使用:

=> (e)
java.lang.ClassNotFoundException: my.package.MyClass
at java.net.URLClassLoader$1.run (URLClassLoader.java:202)
java.security.AccessController.doPrivileged (AccessController.java:-2)
java.net.URLClassLoader.findClass (URLClassLoader.java:190)
clojure.lang.DynamicClassLoader.findClass (DynamicClassLoader.java:61)
java.lang.ClassLoader.loadClass (ClassLoader.java:306)
java.lang.ClassLoader.loadClass (ClassLoader.java:247)
java.lang.Class.forName0 (Class.java:-2)
java.lang.Class.forName (Class.java:169)

最佳答案

REPL 调用的

clojure.lang.Compiler/eval 使用 clojure.lang.Compiler/LOADER,而不是线程本地类加载器。在调用 eval 之前,适当的类加载器需要绑定(bind)到此 var - 因此添加一层包装可以解决此问题:

=> (let [dcl (clojure.lang.DynamicClassLoader. plugin-classloader)]
(with-bindings {clojure.lang.Compiler/LOADER dcl}
(eval '(Class/forName "my.package.MyClass"))))
my.package.MyClass

关于clojure - Clojure 中的 Class/forName 不尊重 ContextClassLoader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com