在Java包中获取一组类文件

在Java包中获取一组类文件,第1张

在Java包中获取一组类文件

我可以使用普通文件I / O和搜索机制解决此问题。您可以查看此处发布的答案。

private static List<Class> getClassesForPackage(Package pkg) {    String pkgname = pkg.getName();    List<Class> classes = new ArrayList<Class>();    // Get a File object for the package    File directory = null;    String fullPath;    String relPath = pkgname.replace('.', '/');    //System.out.println("ClassDiscovery: Package: " + pkgname + " becomes Path:" + relPath);    URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);    //System.out.println("ClassDiscovery: Resource = " + resource);    if (resource == null) {        throw new RuntimeException("No resource for " + relPath);    }    fullPath = resource.getFile();    //System.out.println("ClassDiscovery: FullPath = " + resource);    try {        directory = new File(resource.toURI());    } catch (URISyntaxException e) {        throw new RuntimeException(pkgname + " (" + resource + ") does not appear to be a valid URL / URI.  Strange, since we got it from the system...", e);    } catch (IllegalArgumentException e) {        directory = null;    }    //System.out.println("ClassDiscovery: Directory = " + directory);    if (directory != null && directory.exists()) {        // Get the list of the files contained in the package        String[] files = directory.list();        for (int i = 0; i < files.length; i++) { // we are only interested in .class files if (files[i].endsWith(".class")) {     // removes the .class extension     String className = pkgname + '.' + files[i].substring(0, files[i].length() - 6);     //System.out.println("ClassDiscovery: className = " + className);     try {         classes.add(Class.forName(className));     } catch (ClassNotFoundException e) {         throw new RuntimeException("ClassNotFoundException loading " + className);     } }        }    } else {        try { String jarPath = fullPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", ""); JarFile jarFile = new JarFile(jarPath); Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) {     JarEntry entry = entries.nextElement();     String entryName = entry.getName();     if (entryName.startsWith(relPath) && entryName.length() > (relPath.length() + "/".length())) {         //System.out.println("ClassDiscovery: JarEntry: " + entryName);         String className = entryName.replace('/', '.').replace('\', '.').replace(".class", "");         //System.out.println("ClassDiscovery: className = " + className);         try {  classes.add(Class.forName(className));         } catch (ClassNotFoundException e) {  throw new RuntimeException("ClassNotFoundException loading " + className);         }     } }        } catch (IOException e) { throw new RuntimeException(pkgname + " (" + directory + ") does not appear to be a valid package", e);        }    }    return classes;}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5489237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存