在Grails中如何使用Class.forName?
<!-- Place this tag in your head or just before your close body tag -->
我是在grails的filters里调用的Class.forName("xxx")
问题的根源出在ClassLoader上面,建议补充一下这方面的知识,看完之后你就明白是什么原因了。
一直报java.lang.ClassNotFoundException,换了好几个类来试,有domain有service,全都不行,路径绝对没错,从类的包名直接拷下来再加上了类名,也注意了大小写,还特别去WEB-INF/classes里确认过是有.class文件,之后又重启,clean,但是,一执行到这个方法依然报java.lang.ClassNotFoundException
还有什么可能出问题的地方呢?应该不可能不能用的啊,或者groovy有没有别的替代方法可以实现同样目的?通过类名调用类
在Grails中需要使用当前Thread的ClassLoader,否则,就会出现你上面的问题。这里有个简单的例子:
1 | Class c= Class.forName(className, true, Thread.currentThread().contextClassLoader) |
除了上面的方法,你也可以用GrailsApplication接口中的getClassForName方法。如:
1 | grailsApplication.getClassForName(params.className) |
上面的代码可以在任何能够注入grailsApplication的地方使用,要是没法注入,还可以用下面的代码:
1 | ApplicationHolder.application.getClassForName(className) |