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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |