已知类绝对路径,用URLClassLoader创建对象遇ClassNotFound异常求助
解决ClassNotFoundException的问题
咱们先拆解下你代码里的核心问题,一步步来修正:
类全限定名写错了
你给出的类文件路径是/home/abc/Desktop/test/out/production/test/Rout,这里的/home/abc/Desktop/test/out/production/test/是类文件所在的根目录(也就是classpath的根),而Rout.class直接放在这个目录下,说明这个类没有包名。所以加载类时应该用纯类名"Rout",而不是你写的"test.out.production.test.Rout"——那个是文件系统的路径,不是类的包结构。修正后的可运行代码示例
调整类名参数,同时简化下URL转换的逻辑(Java 7+用Paths更简洁):import java.io.File; import java.net.URL; import java.net.URLClassLoader; public class ClassLoaderDemo { public static void main(String[] args) throws Exception { // 指定类文件所在的根目录 File classRootDir = new File("/home/abc/Desktop/test/out/production/test/"); URL classPathUrl = classRootDir.toURI().toURL(); URLClassLoader customLoader = new URLClassLoader(new URL[]{classPathUrl}); // 用正确的类名加载 Class<?> routClass = customLoader.loadClass("Rout"); // 创建类实例 Object routInstance = routClass.getDeclaredConstructor().newInstance(); customLoader.close(); // 记得关闭类加载器释放资源 } }额外需要注意的细节
- 如果
Rout类实际是有包名的(比如源代码里写了package com.myapp;),那你需要把classpath根改成/home/abc/Desktop/test/out/production/,然后加载类时用"com.myapp.Rout"——包结构要和文件系统的目录层级对应。 - 检查
Rout.class是否真的存在于指定目录,Linux系统下文件名大小写敏感,别把Rout写成rout了。
- 如果
内容的提问来源于stack exchange,提问作者Anurag Kumar
相关产品推荐
相关产品推荐

