簡體   English   中英

"URLClassLoader ClassNotFoundException"

[英]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();
    }

}

問題似乎出在方法getClassNames() 您可以在加載類之前檢查從fixName()返回的完全限定的類名稱嗎? 它將使您更好地了解代碼出了什么問題。

我使用傳遞給fixName()硬編碼值(而不使用getClassNames() )運行您的示例代碼,它能夠加載類文件。

也許是愚蠢的答案,但對我來說,問題是我的項目位於一個受管理員保護的文件夾中。

我嘗試了很多“解決方案”,但我記得當我嘗試將文件解壓縮到我的項目文件夾(我認為可以修復它的一些 .jar lib)時,它一直說由於管理員權限或其他原因無法提取。

每當我將它提取到其他地方並手動復制粘貼時,它都會要求“管理員同意”,我單擊“是”,我可以復制文件。

我的猜測是,它試圖在無法訪問的文件夾中查找類,並返回 null。 下線,返回此錯誤!

因此,如果有人偶然發現“URLClassLoader”和“PolicyException”這樣的問題,還請確保它位於正確的文件夾中!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM