Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了groovy – ClassNotFound被认为很奇怪大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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

谢谢!

解决方法

这是由于ClassLoader. sHell中的ClassLoader(即您在sHell中定义的类)与运行sHell的ClassLoader(运行sHell所需的jar)不同.这就是为什么命令Class.forName(“Foo”,true,this.class.classLoader)有效,因为你在sHell中指定了ClassLoader

尝试

def sHell=new @L_674_3@()

def f=sHell.evaluate("class Foo{Foo(){println this.class.classLoader}};def f=new Foo()")

println sHell.class.classLoader
sHell.evaluate("println this.class.classLoader")

println "-----------"
println Class.forName("Foo",f.class.classLoader)
println Class.forName("Foo",this.class.classLoader)

你会看到第一个Class.forName工作,而不是第二个.运行脚本是类似的,因为它将创建一个不共享sHell的ClassLoader的脚本类

在脚本的上下文中,执行Class.forName将不会使用与此相同的内容.

不确定它是否足够清晰:(

大佬总结

以上是大佬教程为你收集整理的groovy – ClassNotFound被认为很奇怪全部内容,希望文章能够帮你解决groovy – ClassNotFound被认为很奇怪所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。