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 @   yzeng  阅读(1489)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示