反射在很多时候要用,尤其自己编写框架时,那么如何获得当前项目下所有类呢!以下是本人封装的一个比较简洁的方法:
【功能代码】
//通过loader加载所有类 private List<Class> loadClassByLoader(ClassLoader load) throws Exception{ Enumeration<URL> urls = load.getResources(""); //放所有类型 List<Class> classes = new ArrayList<Class>(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); //文件类型(其实是文件夹) if (url.getProtocol().equals("file")) { loadClassByPath(null, url.getPath(), classes, load); } } return classes; } //通过文件路径加载所有类 root 主要用来替换path中前缀(除包路径以外的路径) private void loadClassByPath(String root, String path, List<Class> list, ClassLoader load) { File f = new File(path); if(root==null) root = f.getPath(); //判断是否是class文件 if (f.isFile() && f.getName().matches("^.*\\.class$")) { try { String classPath = f.getPath(); //截取出className 将路径分割符替换为.(windows是\ linux、mac是/) String className = classPath.substring(root.length()+1,classPath.length()-6).replace('/','.').replace('\\','.'); list.add(load.loadClass(className)); } catch (Exception ex) { ex.printStackTrace(); } } else { File[] fs = f.listFiles(); if (fs == null) return; for (File file : fs) { loadClassByPath(root,file.getPath(), list, load); } } }
【使用方法】
List<Class> classes = loadClassByLoader(this.getClass().getClassLoader());
【测试】
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try{ List<Class> classes = loadClassByLoader(this.getClass().getClassLoader()); for (Class c : classes) { System.out.println(c.getName()); } } catch (Exception ex){ ex.printStackTrace(); } resp.sendError(404,"不支持的请求"); }
【结果】
既然都用到反射了,想必你别有用途,此方法或许不是最好的,但是目前我发现最简洁的,直接copy过去用吧!如果你有更好的方法,请评论告诉我。
【附:判断一个Class对象是否继承另一个Classc对象】:
Base.isAssignableFrom(C)
注意:Base和C都是Class对象,若要通过一个类获取Class对象需要使用 类.class ,如Object.class,要通过一个实例获取class对象需要使用 实例.getClass()方法,如:"".getClass()
返回true即:C继承自Base