【发布时间】:2014-11-18 09:08:30
【问题描述】:
我有一个字符串Person,它是一个类Person 的名称。
我可以从那个字符串中得到类Person 吗?我需要这个类来调用 if 的静态方法。
换句话说:有没有与Class.getName()相反的?
如果这根本不起作用,请告诉我。这也是一个答案。
【问题讨论】:
-
下面的答案给了你你想要的吗?
我有一个字符串Person,它是一个类Person 的名称。
我可以从那个字符串中得到类Person 吗?我需要这个类来调用 if 的静态方法。
换句话说:有没有与Class.getName()相反的?
如果这根本不起作用,请告诉我。这也是一个答案。
【问题讨论】:
Class.forName 适用于包括包在内的全名。
如果您只有一个没有包的裸名,那么就没有通用方法,但在 Grails 域类(或其他 Grails 人工制品)的特定情况下,您可以look it up via the grailsApplication。
【讨论】:
def grailsApplication),您可以从grails.util.Holders 检索它的任何其他地方
class Person {
static someMethod() {
println 'Yep'
}
}
如果您知道要调用的方法的名称,则可以执行以下操作...
def className = 'Person'
def clz = Class.forName(className)
clz.someMethod()
如果方法名是动态的,你可以这样做...
def className = 'Person'
def methodName = 'someMethod'
def clz = Class.forName(className)
clz."$methodName"()
【讨论】:
"Calling the method directly on the clz object requires that method to be static as you're effectively calling Person.someMethod()" @beechovsky 没错。 JVM 不允许您在 Class 引用上调用实例方法,因为那没有意义。最初的问题包括"I need the class to call static methods of if.",所以我演示了如何做到这一点。
是的,有一种方法:Class.forName(<String>) 应该可以完成您需要的工作。请注意,您必须传递完全限定的类名(带包)。请参阅docs。
【讨论】:
您可以使用 Class.forName() 获取课程。下面的代码可以帮助你
String type ="com.yourPackage.Person";
Class<Person> m = (Class<Person>) Class.forName(type);
【讨论】:
newInstance?
(Object) 对来自 newInstance() 的返回值的强制转换没有任何意义。您的destClass 引用是用Object 声明的。您可以将任何内容分配给Object 引用。在这种情况下,演员不会做任何事情。您将变量命名为 destClass 的事实让我想知道您是否认为 newInstance() 返回的是 java.lang.Class 对象,而不是该类的实例。