2016-03-13 121 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()); 
    } 
}