加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy方式动态调用静态方法

发布时间:2020-12-14 16:38:44 所属栏目:大数据 来源:网络整理
导读:我知道在Groovy中,您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */String meth = "get"Foo."$meth"(1) 有课吗?我将类的名称作为一个字符串,并希望能够动态地调用该类。例如,想做一些像: String clazz = "Foo""$clazz".get(1) 我觉
我知道在Groovy中,您可以使用字符串调用类/对象上的方法。例如:

Foo."get"(1)
  /* or */
String meth = "get"
Foo."$meth"(1)

有课吗?我将类的名称作为一个字符串,并希望能够动态地调用该类。例如,想做一些像:

String clazz = "Foo"
"$clazz".get(1)

我觉得我错过了一些很明显的东西,只是不能弄清楚。

解决方法

尝试这个:

def cl = Class.forName("org.package.Foo")
cl.get(1)

有点长,但应该工作。

如果要为静态方法创建“开关”代码,我建议实例化类(即使它们只有静态方法),并将实例保存在地图中。然后可以使用

map[name].get(1)

选择其中之一。

[编辑]“$ name”是一个GString和一个有效的语句。 “$ name”.foo()表示“调用GString类的方法foo()。

[EDIT2]当使用Web容器(如Grails)时,必须指定类加载器。有两个选项:

Class.forName("com.acme.MyClass",true,Thread.currentThread().contextClassLoader)

要么

Class.forName("com.acme.MyClass",getClass().classLoader)

第一个选项只能在网络环境下工作,第二种方法也适用于单元测试。这取决于你通常可以使用与调用forName()的类相同的类加载器。

如果您有问题,请使用第一个选项,并在单元测试中设置contextClassLoader:

def orig = Thread.currentThread().contextClassLoader
try {
    Thread.currentThread().contextClassLoader = getClass().classLoader

    ... test ...
} finally {
    Thread.currentThread().contextClassLoader = orig
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读