【问题标题】:how to get class from class-name如何从类名中获取类
【发布时间】:2014-11-18 09:08:30
【问题描述】:

我有一个字符串Person,它是一个类Person 的名称。 我可以从那个字符串中得到类Person 吗?我需要这个类来调用 if 的静态方法。

换句话说:有没有与Class.getName()相反的?

如果这根本不起作用,请告诉我。这也是一个答案。

【问题讨论】:

  • 下面的答案给了你你想要的吗?

标签: grails groovy


【解决方案1】:

Class.forName 适用于包括包在内的全名。

如果您只有一个没有包的裸名,那么就没有通用方法,但在 Grails 域类(或其他 Grails 人工制品)的特定情况下,您可以look it up via the grailsApplication

【讨论】:

  • 我在 agrails 环境下工作,但是如何获取 grailsApplication 呢?
  • 我现在通过以下方式获取 grailsApplication,使其像我想要的一样通用:'def grailsApplication = new Historie().domainClass.grailsApplication'
  • @user3647093 控制器自动拥有它,服务和域可以使用自动装配(类级别def grailsApplication),您可以从grails.util.Holders 检索它的任何其他地方
【解决方案2】:
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"()

【讨论】:

  • 直接在 clz 对象上调用该方法要求该方法是静态的,因为您正在有效地调用 Person.someMethod()。
  • "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.",所以我演示了如何做到这一点。
  • 啊——是的!我现在明白了。
【解决方案3】:

是的,有一种方法:Class.forName(<String>) 应该可以完成您需要的工作。请注意,您必须传递完全限定的类名(带包)。请参阅docs

【讨论】:

    【解决方案4】:

    您可以使用 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 对象,而不是该类的实例。
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2012-03-23
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2019-11-11
    相关资源
    最近更新 更多