gpt4 book ai didi

java - 如何调用StaticMethodExpr.eval?

转载 作者:行者123 更新时间:2023-12-01 08:55:42 25 4
gpt4 key购买 nike

我正在关注this series了解 clojure 编译器的工作原理。

我尝试使用以下代码调用 StaticMethodExpreval 方法

(ns clojure.lang
(:use clojure.core)
(:import [clojure.lang Compiler Compiler$C]))

(def form (read-string "(+ 1 1)") )

(def expr (Compiler/analyze Compiler$C/EXPRESSION form))

(.eval expr)

但运气不好并抛出IllegalArgumentException:

Unhandled java.lang.IllegalArgumentException
Can't call public method of non-public class: public
java.lang.Object clojure.lang.Compiler$StaticMethodExpr.eval()

我是否遗漏了什么,或者是这个 a bug in jdk

最佳答案

您仍然可以使用反射调用该方法:

(let [m (.getDeclaredMethod clojure.lang.Compiler$Expr "eval" (make-array Class 0))]
(.setAccessible m true)
(defn -eval [expr]
(.invoke m expr (object-array 0))))

(-eval (clojure.lang.Compiler/analyze clojure.lang.Compiler$C/EXPRESSION '(+ 1 2)))
;= 3

如果您的目标是探索,这应该足够好了。

无反射的 Java 程序可以通过 clojure.lang.Compiler.HostExpr 类型的引用对分析 (+ 1 2) 的结果调用此方法,这是公共(public)的,尽管 clojure.lang.Compiler.Expr 的声明接口(interface)和实际运行时类型都不是公共(public)的,所以我认为 setAccessible 是有点令人惊讶必填。

关于java - 如何调用StaticMethodExpr.eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048786/

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