【问题标题】:Navigate through folders to load classes浏览文件夹以加载类
【发布时间】:2016-06-28 04:26:49
【问题描述】:

我希望能够浏览文件夹中的所有文件夹以加载这些文件夹中的类

我当前的代码没有检查所有的包。它只会加载未打包的类。

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

【问题讨论】:

标签: java class packages urlclassloader


【解决方案1】:

如果有帮助,请检查此代码。由于声誉问题,我无法直接将链接作为评论发布。 我是从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());
    }
}

【讨论】:

    【解决方案2】:

    为了加载一个类对象,你必须包含包前缀。因此,您需要知道类的根文件夹存在于何处。在您的情况下,它似乎是 Scripts 文件夹。

    当您导航到子文件夹时,您需要捕获每个子文件夹名称并将其添加到您希望加载的类的包前缀中。

    所以,例如。在脚本下,如果你有 com/packagea/packageb/classA.class 然后你需要将它加载为“com.packagea.packageb.classA”。再次假设脚本是您的类的起点。

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 2010-11-21
      • 2012-09-04
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多