微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何获取包中的所有类名?

参见英文答案 > Can you find all classes in a package using reflection?21
所以我有一个包含扩展JPanel的类的包,我想将它们作为选项卡动态添加.一开始我使用了一个工厂,我注册了所有的类,它的工作,但现在我想加载包中的所有类,而不知道他们的名字.我已经尝试了几件事情,包括 Reflections library(我觉得很混乱),我无法让他们上班.我感谢任何帮助.

这是我的一个尝试:

public static void registerTab() {
    String pkg = TabA.class.getPackage().getName();
    String relPath = pkg.replace('.','/');

    URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);
    if (resource == null) {
        throw new RuntimeException("Unexpected problem: No resource for "
                + relPath);
    }

    File f = new File(resource.getPath());

    String[] files = f.list();

    for (int i = 0; i < files.length; i++) {

        String fileName = files[i];
        String className = null;
        String fileNm = null;

        if (fileName.endsWith(".class")) {

            fileNm = fileName.substring(0,fileName.length() - 6);
            className = pkg + '.' + fileNm;
        }

        if (className != null) {

            if (!tabClasses.containsKey(className))
                tabClasses.put(fileNm,className);
        }
    }
}

解决方法

这是我开发的一个定制解决方案来查找包的所有类:
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;
    }

}

然后,只需使用:

List<Class<?>> classes = ClassFinder.find("com.package");

原文地址:https://www.jb51.cc/java/125545.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐