【问题标题】:How to get java class in groovy using reflection如何使用反射在groovy中获取java类
【发布时间】: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)

标签: java groovy


【解决方案1】:

您需要使用完全限定的类名,并且还要确保类加载器已经加载了该类,这意味着您在导致它被加载的其他上下文中引用了该类。


// groovysh session

groovy:000> dateClass = Class.forName("java.util.Date")
===> class java.util.Date

groovy:000> x=dateClass.invokeMethod("newInstance", null)
===> Tue Jul 16 08:12:51 PDT 2019

groovy:000> x
===> Tue Jul 16 08:12:51 PDT 2019

// or

groovy:000> dateClass."newInstance"()
===> Tue Jul 16 08:24:02 PDT 2019

// or

groovy:000> dateClass."newInstance"(8456245)
===> Wed Dec 31 18:20:56 PST 1969

// also

groovy:000> ni="newInstance"
===> newInstance

groovy:000> dateClass."${ni}"()
===> Tue Jul 16 08:27:45 PDT 2019

groovy:000> dateClass."${ni}"(8456245)
===> Wed Dec 31 18:20:56 PST 1969

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多