ClassNotFound(是的,我知道,有很多关于此异常的帖子;我在这里和其他地方搜索过,但找不到解释)
为什么 Class.forName 会失败?
groovy> class Foo {
groovy> }
groovy> def f = new Foo()
groovy> def cname = f.getClass().getName()
groovy> def p = f.getClass().getPackage()
groovy> def l = f.getClass().getClassLoader()
groovy> println "Foo class name: $cname"
groovy> println "Foo package: $p"
groovy> println "Foo class loader: ${f.getClass().getClassLoader().toString()}"
groovy> println "Current class loader: ${this.getClass().getClassLoader().toString()}"
groovy> try {
groovy> Class.forName(cname)
groovy> } catch (Exception e) {
groovy> println e
groovy> }
groovy> l.findClass("Foo")
Foo class name: Foo
Foo package: null
Foo class loader: groovy.lang.GroovyClassLoader$InnerLoader@2d275595
Current class loader: groovy.lang.GroovyClassLoader$InnerLoader@2d275595
java.lang.ClassNotFoundException: Foo
Exception thrown
Oct 16, 2012 4:43:28 PM org.codehaus.groovy.runtime.StackTraceUtils sanitize
WARNING: Sanitizing stacktrace:
java.lang.ClassNotFoundException: Foo
谢谢!
最佳答案
给出的答案基本上是正确的,但它缺少一个重要的信息。 Class.forName(String)
是用于从 Java 调用 Java 的 Java 方法。它需要让类加载器加载给定的类。它通过使用内部方法向上遍历调用堆栈来获取加载器。对于 Java 来说,上一级是正确的做法,但在 Groovy 中却是不正确的。 Groovy 中的每个方法调用都可以包含可变数量的中间调用堆栈元素,这些元素来自生成的方法、invokedynamic、反射。但通常父调用堆栈帧不包含真正的调用者类。相反,您最终会在 groovy 运行时的加载器中,甚至在 java 运行时的加载器中。 shell 中的类是这些类的子类,因此加载器不可能找到请求的类。
关于groovy - ClassNotFound 被认为是奇怪的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925882/