2016-03-13 5 views
0

Хорошо, поэтому я в настоящее время сканирую папку/Scripts/для папок и проверяю эти папки для .classИзмените упаковку с "/" на "."

Проблема в том, когда я загружаю классы в classloader, я получаю сообщение об ошибке с упаковкой. Он не заменяет «/» на «.». как и следовало бы.

Мой код:

@SuppressWarnings({"rawtypes", "unchecked"}) 
    public Class[] getClassesFromFolder() { 
     File folder = getFolder(); 
     String thePath = folder.getPath(); 
     ArrayList<String> folders = new ArrayList<String>(); 
     ArrayList<String> classesName = new ArrayList<String>(); 

     try { 
      Files.walk(Paths.get(thePath + "\\Scripts\\")).forEach(filePath -> { 
       if (Files.isDirectory(filePath)) { 
        folders.add(filePath.toString()); 
       } 
       if (Files.isRegularFile(filePath)) { 
        classesName.add(filePath.getFileName().toString()); 
       } 
      }); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     ArrayList<Class<Script>> classes = new ArrayList<Class<Script>>(); 
     try { 
     for(int i = 0; i < folders.size(); i++) { 


      File scriptFolder = new File(folders.get(i).replaceAll("/", "\\\\")); 
      System.out.println(scriptFolder.toString()); 



      URLClassLoader cl = new URLClassLoader(new URL[] { 
        new File(scriptFolder.toString()) 
        .toURI().toURL() }); 
      for(int y = 0; y < classesName.size(); y++) { 
      String script = classesName.get(y); 

       if (script.contains(".class") && !script.contains("$")) { 

        String truePath = script.replace(".class", ""); 

        try { 
         Class<?> scriptClass = (Class<?>) cl 
           .loadClass(truePath); 
         classes.add((Class<Script>) scriptClass); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 


       } 
      } 

      cl.close(); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

Ошибка:

C:\Users\Ethan\Client\Scripts\com\ethan\test\main 
Exception in thread "Thread-7" java.lang.NoClassDefFoundError: Core (wrong name: com/ethan/test/main/Core) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at java.security.SecureClassLoader.defineClass(Unknown Source) 
    at java.net.URLClassLoader.defineClass(Unknown Source) 
    at java.net.URLClassLoader.access$100(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at com.client.api.script.ScriptManager.getClassesFromFolder(ScriptManager.java:103) 
    at com.client.ui.components.ScriptSelector.getData(ScriptSelector.java:57) 
    at com.client.ui.components.ScriptSelector.<init>(ScriptSelector.java:42) 
    at com.client.ui.components.sidebar.panels.RunPanel$1.run(RunPanel.java:59) 
+0

Вы находитесь в неправильной папке, переходите от 'C: \ Users \ Ethan \ Client \ Scripts \ com \ ethan \ test \ main' к' C: \ Users \ Ethan \ Client \ Scripts'. –

ответ

0

Если у вас есть файл с именем

C:\Users\Ethan\Client\Scripts\com\ethan\test\main\Core.class 

это, скорее всего, класс с именем Core в пакете com.ethan.test.main.

Если это дело, URLClassLoader необходимо дать путь

C:\Users\Ethan\Client\Scripts 

и метод loadClass() должен быть присвоено имя

com.ethan.test.main.Core 

Это точно так же, как вы должны были бы делать из командной строки, если класс имел метод main():

java -cp C:\Users\Ethan\Client\Scripts com.ethan.test.main.Core 

 Смежные вопросы

  • Нет связанных вопросов^_^