groovy - ClassNotFound 被认为是奇怪的

标签 groovy

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/

相关文章:

groovy - 如何在 Groovy 中创建临时文件?

java - 如何在 Java 或 Groovy 中找到下一个 Double?

groovy - Jenkins作业运行系统Groovy脚本如何响应用户kill

java - 如何在Gradle 6.5.1中获取我的项目的相对路径apk

java - 使用 Groovy JAVA 在 JIRA 中设置自定义字段值

java - 获取 spring :bind status. errorMessage 填充时出现问题

java - Springboot : How to make Rest Service Controller non-blocking

grails - 格式化时间

json - 呈现为JSON时Grails中缺少方法异常

multithreading - Groovy GPars如何按线程号/计数休眠线程?