2016-03-13 120 views
1

我希望能夠瀏覽,雖然一個文件夾中的所有文件夾來加載這些文件夾中的類通過瀏覽文件夾加載類

我當前的代碼不檢查所有軟件包。它只會在沒有打包的情況下加載類。

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

     URL[] path = {new URL("file://" + thePath + "/Scripts/")}; 
     File scriptFolder = new File(getFolder().getPath() + "/Scripts"); 
     URLClassLoader cl = new URLClassLoader(path); 
     for (String script : scriptFolder.list()) { 
      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(); 
    } 
    return classes.toArray(new Class<?>[classes.size()]); 
} 
+0

什麼具體是你的問題?不要期望其他人從您的代碼中扣除可能想到的內容;以及爲什麼這不起作用。 – GhostCat

回答

0

爲了加載一個Class對象,必須包含包前綴。所以,你需要知道類的根文件夾存在於哪裏。在你的情況,它似乎是腳本文件夾。

當您導航到子文件夾時,您需要捕獲每個子文件夾名稱並將其添加到您希望加載的類的包前綴中。例如,

因此,例如。在腳本下,如果你有com/packagea/packageb/classA.class 那麼你需要把它加載爲'com.packagea.packageb.classA'。再次假設腳本是您的類的起點。

0

檢查此代碼是否有幫助。由於聲譽,我無法直接發佈鏈接作爲評論。 我從How to get all classes names in a package?採取 - 感謝作者。

public class ClassFinder { 

    private static final char PKG_SEPARATOR = '.'; 

    private static final char DIR_SEPARATOR = '/'; 

    private static final String CLASS_FILE_SUFFIX = ".class"; 

    private static final String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?"; 

    public static List<Class<?>> find(String scannedPackage) { 
     String scannedPath = scannedPackage.replace(PKG_SEPARATOR, DIR_SEPARATOR); 
     URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath); 
     if (scannedUrl == null) { 
      throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage)); 
     } 
     File scannedDir = new File(scannedUrl.getFile()); 
     List<Class<?>> classes = new ArrayList<Class<?>>(); 
     for (File file : scannedDir.listFiles()) { 
      classes.addAll(find(file, scannedPackage)); 
     } 
     return classes; 
    } 

    private static List<Class<?>> find(File file, String scannedPackage) { 
     List<Class<?>> classes = new ArrayList<Class<?>>(); 
     String resource = scannedPackage + PKG_SEPARATOR + file.getName(); 
     if (file.isDirectory()) { 
      for (File child : file.listFiles()) { 
       classes.addAll(find(child, resource)); 
      } 
     } else if (resource.endsWith(CLASS_FILE_SUFFIX)) { 
      int endIndex = resource.length() - CLASS_FILE_SUFFIX.length(); 
      String className = resource.substring(0, endIndex); 
      try { 
       classes.add(Class.forName(className)); 
      } catch (ClassNotFoundException ignore) { 
      } 
     } 
     return classes; 
    } 

    public static void main(String[] args) { 
     List<Class<?>> classes = ClassFinder.find("com"); 
     System.out.println(classes.toString()); 
    } 
}