groovy – ClassNotFound被认为很奇怪
发布时间:2020-12-14 16:22:54 所属栏目:大数据 来源:网络整理
导读:ClassNotFound(是的,我知道,有很多关于这个例外的帖子;我在这里和其他地方搜索过,找不到解释) 为什么Class.forName会失败? groovy class Foo { groovy } groovy def f = new Foo() groovy def cname = f.getClass().getName() groovy def p = f.getClass().
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 GroovyShell() 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将不会使用与此相同的内容. 不确定它是否足够清晰:( (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |