亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

java如何掃描本項目下的所有類

標簽:
Java

最近在写一个依赖注入的小demo,碰到这么样的一个问题:

要把本项目下所有被@Component修饰的所有类注入到容器当中。

思路很简单,通过文件枚举的方式扫描出本项目的所有类文件,再对文件名进行一些小处理,就能得到本项目的所有类。

public static void scanAllClasses() {
       String url = getClassPath();
       List<String> classes = getClassesList(url);
       // 遍历classes,如果发现@Component就注入到容器中
       scanComponent2Container(classes);

   }

其中,getClassPath这个方法的实现如下:

private static String getClassPath() {
       String url = URLDecoder.decode(Context.class.getResource("/").getPath(), Charset.defaultCharset());
       if (url.startsWith("/")) {
           url = url.replaceFirst("/", "");
       }
       url = url.replaceAll("/", "\\\\");
       return url;
   }

就是通过类来取出这个类所在文件的绝对路径,并进行一些文本处理。

而getClassesList则是根据传入的类路径,通过递归进行文件枚举:

private static List<String> getClassesList(String url) {
       File file = new File(url);
       List<String> classes = getAllClass(file);
       for (int i = 0; i < classes.size(); i++) {
           classes.set(i, classes.get(i).replace(url, "").replace(".class", "").replace("\\", "."));
       }
       return classes;
   }

递归函数:

private static List<String> getAllClass(File file) {
       List<String> ret = new ArrayList<>();
       if (file.isDirectory()) {
           File[] list = file.listFiles();
           for (var i : list) {
               var j = getAllClass(i);
               ret.addAll(j);
           }
       } else {

           ret.add(file.getAbsolutePath());
       }
       return ret;
}

基本原理就是判断file是否为目录,如果是,继续递归,否则如果文件是class文件,加入到list,返回。

那这样,就能得到本项目下的所有类。

值得注意的是,这种方式不适用jar执行包,因为如果java直接执行jar包的话,第一步得到的类路径就是jar包的地址。

所以如果最终运行的是jar包的话,必须通过jar输入流进行读取。


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消