【发布时间】:2019-07-16 13:52:38
【问题描述】:
我有一个 groovy 脚本,我想从中访问 java 类的静态方法。 java类和方法的名称,将被输入到groovy。 我将读取类和方法的名称,然后像这样调用:
"$apiClass"."$apiMethod"("UTC")
我是 groovy 的新手,不知道如何有效地使用反射。 下面是代码:
def exp="[MyDateUtil:getFirstDate](UTC)"
def m=exp=~ /(?<=\[).+?(?=\])/
assert m instanceof Matcher
def apiDef
while(m.find()) {
apiDef =m.group()
}
def (apiClass, apiMethod) = apiDef.split(":")
def output = "$apiClass"."$apiMethod"("UTC")`
我在想下面的行会起作用,但它无法获得课程
def output = "$apiClass"."$apiMethod"("UTC")
如果我只给出方法名称作为变量,它可以正常工作:
def output = MyDateUtil."$apiMethod"("UTC")
【问题讨论】:
-
如果您可以将其转换为普通的 groovy/java 代码
[MyDateUtil:getFirstDate](UTC)->MyDateUtil.getFirstDate("UTC")那么您可以使用def output = Eval.me( 'MyDateUtil.getFirstDate("UTC")' ) -
不,如果我这样写: def output = Eval.me("$apiClass"."$apiMethod"("UTC")) 它给了我以下错误 Caught: groovy.lang.MissingMethodException :没有方法签名:java.lang.String.getFirstDate() 适用于参数类型:(字符串)值:[UTC]
-
String script = "$apiClass.$apiMethod('UTC')"然后在script应该有MyDateUtil.getFirstDate('UTC'),你只需要打电话给def output = Eval.me(script)