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
致读者:感谢你阅读本文,请随手点击右下角的推荐或分享,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?