java – 如何获取包中的所有类名?
发布时间:2020-09-18 17:12:23  所属栏目:Java  来源:互联网 
            导读:参见英文答案 Can you find all classes in a package using reflection?21 所以我有一个包含扩展JPanel的类的包,我想将它们作为选项卡动态添加.一开始我使用了一个工厂,我注册了所有的类,它的工作,但现在我想加载包中的所有类,而不知道他们的名字.我已经尝试
                
                
                
            | 
                         参见英文答案 > 
 Can you find all classes in a package using reflection?21 
  这是我的一个尝试: 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");                        (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
相关内容
- java – HashMap中的NULL键的Hashcode
 - java – 科特林:为什么我不能在循环守卫中做任务?
 - java – 如何使用Spring重新加载属性?
 - java中fastjson生成和解析json数据(序列化和反序列化数据)
 - 基于java解析JSON的三种方式详解
 - 是否有Java几何库? (不是JTS)
 - Java定时任务:利用java Timer类实现定时执行任务的功能
 - Java中的“synchronized(this)”vs.“synchronized((BaseCl
 - java – 整数自动装箱和自动装箱提供了性能问题?
 - java – 使用for-each循环时LinkedList中的Nullpointer异常
 
