gpt4 book ai didi

groovy - ClassNotFound 被认为是奇怪的

转载 作者:行者123 更新时间:2023-12-05 01:18:42 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com