0

I'm trying to write a code that loads classes dynamically at run time

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

}

the problem is that this keeps giving me classNotFound exception , tho i'm pretty sure files .class exist in that directory , another thing I've tried loading already loaded classes and it worked , so it doesn't work only if my code doesn't have the class file !!

4

2 回答 2

1

问题似乎出在方法上getClassNames()。您能否检查fixName()在加载类之前返回的完全限定类名?它会让您更好地了解代码有什么问题。

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

于 2014-12-29T05:29:36.083 回答
0

也许是愚蠢的答案,但对我来说,问题是我的项目位于一个受管理员保护的文件夹中。

我尝试了很多“解决方案”,但我记得当我尝试将文件解压缩到我的项目文件夹(我认为可以修复它的一些 .jar lib)时,它一直说由于管理员权限或其他原因无法提取。

每当我将它提取到其他地方并手动复制粘贴时,它都会要求“管理员同意”,我单击“是”,我可以复制文件。

我的猜测是,它试图在无法访问的文件夹中查找类,并返回 null。下线,返回此错误!

因此,如果有人偶然发现“URLClassLoader”和“PolicyException”这样的问题,还请确保它位于正确的文件夹中!!!

于 2022-02-02T14:50:03.357 回答