有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java URLClassLoader ClassNotFoundException

我试图编写一个代码,在运行时动态加载类

public class URLDynClassLoader {

    public URLDynClassLoader(){
        try{
            loadclasses( new File("C:/Users/Miller/Desktop/test/") , "Shapes." );
        }
        catch(ClassNotFoundException e){
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
        catch( Exception f ){
            System.out.println(f.getMessage());
            System.out.println("error");
        }
    }

    private ArrayList<String> getClassNames( File folder ){
        File[] listOfFiles = folder.listFiles();
        ArrayList<String> fileNames = new ArrayList<String>() ;
        for (File file : listOfFiles) {
            if (file.isFile()) {
                if( accept(file.getName()) ){
                    fileNames.add(file.getName());
                }
            }
        }
        return fileNames ;
    }

    ArrayList<Class> loadclasses( File folder , String packageName ) throws MalformedURLException, ClassNotFoundException{

        URLClassLoader load = URLClassLoader.newInstance( new URL[] { folder.toURL() })  ;
        ArrayList<Class> data = new ArrayList<Class>();
        ArrayList<String> names = getClassNames(folder);

        for(int i=0 ; i<names.size() ; ++i){;
            data.add(load.loadClass( fixName( packageName , names.get(i) ) ));
            System.out.println("i"+i);
        }

        return data ;
    }

    private String fixName(String packageName, String className ) {
        className = className.replaceAll(".class", "");
        return packageName+className;
    }

    public boolean accept(String arg) { 
        return arg.endsWith(".class"); 
    } 

    public static void main(String[] args) {
        new URLDynClassLoader();
    }

}

问题是,这一直给我classNotFound异常,尽管我非常确定这些文件。类存在于该目录中,另一件事是我尝试加载已经加载的类,它工作了,所以只有当我的代码没有类文件时它才工作


共 (1) 个答案

  1. # 1 楼答案

    问题似乎在于方法getClassNames()。在加载类之前,您能检查从fixName()返回的完全限定类名吗?它会让你更好地了解代码的错误

    我用传递给fixName()(不使用getClassNames())的硬编码值运行了示例代码,它能够加载类文件