Class 为什么可以';我不能从另一个Groovy类实例化一个Groovy类吗?

Class 为什么可以';我不能从另一个Groovy类实例化一个Groovy类吗?,class,groovy,classloader,instance,Class,Groovy,Classloader,Instance,我有两节课。一、groovy: class One { One() {} def someMethod(String hey) { println(hey) } } 第二,groovy: class Two { def one Two() { Class groovy = ((GroovyClassLoader) this.class.classLoader).parseClass("One.groovy") one = groovy.new

我有两节课。一、groovy:

class One {

  One() {}

  def someMethod(String hey) {
    println(hey)
  }
}
第二,groovy:

class Two {

  def one

  Two() {
    Class groovy = ((GroovyClassLoader) this.class.classLoader).parseClass("One.groovy")
    one = groovy.newInstance()
    one.someMethod("Yo!")
  }
}
我用如下方式实例化了两个:

GroovyClassLoader gcl = new GroovyClassLoader();
Class cl = gcl.parseClass(new File("Two.groovy"));
Object instance = cl.newInstance();
但是现在我得到了
groovy.lang.MissingMethodException:没有方法的签名:script13561062248721121730020。someMethod()适用于参数类型:(java.lang.String)值:[Yo!]


有什么想法吗?

似乎是因为调用了groovy类加载器方法:即以文本格式解析脚本。使用
文件
在这里工作:

class Two {

  def one

  Two() {
    Class groovy = ((GroovyClassLoader) this.class.classLoader).parseClass("One.groovy")
    assert groovy.superclass == Script // whoops, not what we wanted

    Class groovy2 = ((GroovyClassLoader) this.class.classLoader).parseClass(new File("One.groovy"))
    one = groovy2.newInstance()
    assert one.class == One // now we are talking :-)


    one.someMethod("Yo!") // prints fine

  }
}

parseClass(String)
要求脚本/类的文本作为其参数,而不是文件名。因此,您正在编译一个包含一条语句的脚本,该语句获取名为
One
的绑定变量,然后尝试获取其
groovy
属性的值。我假设您知道您可以说“def One=new One()”而不是…?@BillK Sure。在我的本地示例中,我使用了
one
作为实例变量,它只是停留在这里。我的意思是,您根本不必使用GroovyClassLoader,如果您从2调用new one(),并且.groovy文件位于类路径中,它就可以正常工作。