0

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

} 

문제는 이것이 내가 파일을 .class가 존재 확신 그래도, 나에게면 ClassNotFound 예외를주고 유지한다는 것입니다 디렉토리, 이미로드 된 클래스를로드하려고 시도한 또 다른 것은 그것이 작동하므로 내 코드에 클래스 파일이없는 경우에만 작동하지 않습니다 !!

+0

'import java.net.URLClassLoader;'... – Reimeus

+0

또한 for (int i = 0; i Ambrish

+0

또한 스택 추적을 제공하십시오. – Ambrish

답변

1

문제는 getClassNames() 인 것으로 보입니다. 수업을로드하기 전에 fixName()에서 반환 된 정규 클래스 이름을 확인해 주시겠습니까? 코드에 무엇이 잘못된 것인지 더 잘 알 수 있습니다.

나는 ( getClassNames()를 사용하지 않고) fixName()에 전달 하드 코딩 값을 사용하여 샘플 코드를 실행하고이 클래스 파일을로드 할 수 있었다.

+0

다시 확인했습니다. 함수는 완전히 클래스 이름을 얻습니다. 바이너리 클래스 파일을 프로젝트 bin 폴더에 넣었고 URLClassLoader가 작동합니다. 그것은 어느 곳에서나 클래스를로드합니다. 문제가되는 바이너리 폴더의 클래스 사본을 가져 왔습니다. URL 만 사용하여 새로운 클래스를 추가하고 싶습니다. –

관련 문제