项目中,加载指定的类反射调用方法一直报类找不到,经过数百次的测试,对这种问题有了一个重新的认识,特总结、记录、分享如下:
1、路径中尽可能用"/"或者File.separator()而非“\”,路径中“\”是windows平台的,linux平台中是“/”,java中也是用“/”作为路径的,所以为了跨平台和更规范,建议采用前者
2、在当前的环境中获取绝对路径后,尽可能的replace(“\”,"/")一下,windows平台开发中这个很需要的
3、new File中字符串路径如果是文件夹后边可以不带“/”,但如果你直接是new URL("路径")来指定加载类的路径的话,后边必须追加“/”否则会以文件处理找不到的
4、由file转成URL时,建议别采用File.toURL()此方法已经被JDK1.6及以后版本淘汰了,属于过时API,应该采用file.toURI().toURL()方法
5、路径中非法字符会这转成URI的过程中变成"%20",不过不会影响程序的运行,路径中如有汉字也是可以的,不要过于担心这一点,不过调试一下小心乱码。建议路径还是非汉字正常字符组成的比较好。
6、最最重要的一点,就是加载的类如果有包名,如com..text;,一定要把类的路径写成com文件的上一层,而load("类名")时,一定要写上包名如com..text.Formatter,网上很多简单的测试类都没注意到这一点,如果你路径中非要写上包名而且测试还通过了,恭喜你,你碰巧了,因为如果路径不对类加载器load不到的话会去当前类的路径下边去找,你肯定把这个被加载的测试类和加载的写在一个包下了。
————————————————
版权声明:本文为CSDN博主「Java我人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenleixing/article/details/46422115
【例】
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new File(jarAddress).toURI().toURL()},
Thread.currentThread().getContextClassLoader());
urlClassLoader.loadClass(className);