Java反射获取当前项目下所有类,支持Servlet

反射在很多时候要用,尤其自己编写框架时,那么如何获得当前项目下所有类呢!以下是本人封装的一个比较简洁的方法:

 

【功能代码】

   //通过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

 

posted @ 2019-03-01 11:03  yzeng  阅读(1459)  评论(0编辑  收藏  举报