为 DynamicClassLoader 中的 classes 获取(或写入)class 文件
Get (or write) class files for the classes in the DynamicClassLoader
有什么方法可以 find/write class 文件 DynamicClassLoader
中的 class 文件吗?
(let [f #(+ 1 %)
cls (class f)
cl (.getClassLoader cls)]
(println (.getName cls)) ; => my.project.namespace$eval123$f__4321
;; Do something here to get a path to a class file
;; .../my/project/namespace/eval123$f__4321.class
)
那些 class 永远不会被写入,并且没有机制可以从 Class 对象中发现会产生 class 的一系列字节。据我所知,您能做的最好的事情就是使用 JVM 检测工具在编译时记录 class 的字节。我不是这方面的专家,但 no-disassemble
以某种方式做到了;您可以使用它,也可以使用类似的方法自己完成。
浏览 Clojure 源代码后,我发现了一个完全符合我要求的编译器变量。我不知道我是否会推荐这种方法,但到目前为止它对我来说效果很好。
(.bindRoot Compiler/COMPILE_FILES true)
这会将 .class
个文件写入 *compile-path*
下的路径。
有什么方法可以 find/write class 文件 DynamicClassLoader
中的 class 文件吗?
(let [f #(+ 1 %)
cls (class f)
cl (.getClassLoader cls)]
(println (.getName cls)) ; => my.project.namespace$eval123$f__4321
;; Do something here to get a path to a class file
;; .../my/project/namespace/eval123$f__4321.class
)
那些 class 永远不会被写入,并且没有机制可以从 Class 对象中发现会产生 class 的一系列字节。据我所知,您能做的最好的事情就是使用 JVM 检测工具在编译时记录 class 的字节。我不是这方面的专家,但 no-disassemble
以某种方式做到了;您可以使用它,也可以使用类似的方法自己完成。
浏览 Clojure 源代码后,我发现了一个完全符合我要求的编译器变量。我不知道我是否会推荐这种方法,但到目前为止它对我来说效果很好。
(.bindRoot Compiler/COMPILE_FILES true)
这会将 .class
个文件写入 *compile-path*
下的路径。