zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    设计权限管理系统(十一)
    设计权限管理系统(十)
    设计权限管理系统(九)
    设计权限管理系统(八)
    设计权限管理系统(七)
    设计权限管理系统(六)
    设计权限管理系统(五)
    设计权限管理系统(四)
    设计权限管理系统(三)
    Dom的深度优先遍历和广度优先遍历
  • 原文地址:https://www.cnblogs.com/yzeng/p/10455200.html
Copyright © 2011-2022 走看看