博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 扫描包下所有类(包括jar包)
阅读量:6825 次
发布时间:2019-06-26

本文共 8592 字,大约阅读时间需要 28 分钟。

package com.MyUtils.file;  [java] view plain copy    import java.io.File;      import java.io.FileFilter;      import java.io.IOException;      import java.net.JarURLConnection;      import java.net.URI;      import java.net.URISyntaxException;      import java.net.URL;      import java.util.ArrayList;      import java.util.Enumeration;      import java.util.List;      import java.util.jar.JarEntry;      import java.util.jar.JarFile;                  /**      * 扫描包下路径       * 包括本地文件和jar包文件      * @author ljb      *      */      public class ScanningFile {                    private Class
superStrategy = String.class;//接口类class 用于过滤 可以不要 private List
> eleStrategyList = new ArrayList
>(); private ClassLoader classLoader = ScanningFile.class.getClassLoader();//默认使用的类加载器 private static final String STARATEGY_PATH = "com.MyUtils.file";//需要扫描的策略包名 public static void main(String[] args) { ScanningFile s = new ScanningFile(); s.addClass(); } /** * 获取包下所有实现了superStrategy的类并加入list */ private void addClass(){ URL url = classLoader.getResource(STARATEGY_PATH.replace(".", "/")); String protocol = url.getProtocol(); if ("file".equals(protocol)) { // 本地自己可见的代码 findClassLocal(STARATEGY_PATH); } else if ("jar".equals(protocol)) { // 引用jar包的代码 findClassJar(STARATEGY_PATH); } } /** * 本地查找 * @param packName */ private void findClassLocal(final String packName){ URI url = null ; try { url = classLoader.getResource(packName.replace(".", "/")).toURI(); } catch (URISyntaxException e1) { throw new RuntimeException("未找到策略资源"); } File file = new File(url); file.listFiles(new FileFilter() { public boolean accept(File chiFile) { if(chiFile.isDirectory()){ findClassLocal(packName+"."+chiFile.getName()); } if(chiFile.getName().endsWith(".class")){ Class
clazz = null; try { clazz = classLoader.loadClass(packName + "." + chiFile.getName().replace(".class", "")); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(chiFile); if(superStrategy.isAssignableFrom(clazz)){ eleStrategyList.add((Class
) clazz); } return true; } return false; } }); } /** * jar包查找 * @param packName */ private void findClassJar(final String packName){ String pathName = packName.replace(".", "/"); JarFile jarFile = null; try { URL url = classLoader.getResource(pathName); JarURLConnection jarURLConnection = (JarURLConnection )url.openConnection(); jarFile = jarURLConnection.getJarFile(); } catch (IOException e) { throw new RuntimeException("未找到策略资源"); } Enumeration
jarEntries = jarFile.entries(); while (jarEntries.hasMoreElements()) { JarEntry jarEntry = jarEntries.nextElement(); String jarEntryName = jarEntry.getName(); if(jarEntryName.contains(pathName) && !jarEntryName.equals(pathName+"/")){ //递归遍历子目录 if(jarEntry.isDirectory()){ String clazzName = jarEntry.getName().replace("/", "."); int endIndex = clazzName.lastIndexOf("."); String prefix = null; if (endIndex > 0) { prefix = clazzName.substring(0, endIndex); } findClassJar(prefix); } if(jarEntry.getName().endsWith(".class")){ Class
clazz = null; try { clazz = classLoader.loadClass(jarEntry.getName().replace("/", ".").replace(".class", "")); } catch (ClassNotFoundException e) { e.printStackTrace(); } if(superStrategy.isAssignableFrom(clazz)){ eleStrategyList.add((Class
) clazz); } } } } } }

 

  1. package com.MyUtils.file;  
[java]
  1. import java.io.File;  
  2. import java.io.FileFilter;  
  3. import java.io.IOException;  
  4. import java.net.JarURLConnection;  
  5. import java.net.URI;  
  6. import java.net.URISyntaxException;  
  7. import java.net.URL;  
  8. import java.util.ArrayList;  
  9. import java.util.Enumeration;  
  10. import java.util.List;  
  11. import java.util.jar.JarEntry;  
  12. import java.util.jar.JarFile;  
  13.   
  14.   
  15. /** 
  16.  * 扫描包下路径  
  17.  * 包括本地文件和jar包文件 
  18.  * @author ljb 
  19.  * 
  20.  */  
  21. public class ScanningFile {  
  22.       
  23.     private Class<?> superStrategy = String.class;//接口类class 用于过滤 可以不要  
  24.       
  25.     private List<Class<? extends String>> eleStrategyList = new ArrayList<Class<? extends String>>();  
  26.       
  27.     private ClassLoader classLoader = ScanningFile.class.getClassLoader();//默认使用的类加载器  
  28.       
  29.     private static final String STARATEGY_PATH = "com.MyUtils.file";//需要扫描的策略包名  
  30.       
  31.     public static void main(String[] args) {  
  32.         ScanningFile s = new ScanningFile();  
  33.         s.addClass();  
  34.     }  
  35.        
  36.     /** 
  37.      * 获取包下所有实现了superStrategy的类并加入list 
  38.      */  
  39.     private void addClass(){  
  40.         URL url = classLoader.getResource(STARATEGY_PATH.replace(".""/"));  
  41.         String protocol = url.getProtocol();    
  42.         if ("file".equals(protocol)) {    
  43.             // 本地自己可见的代码    
  44.             findClassLocal(STARATEGY_PATH);  
  45.         } else if ("jar".equals(protocol)) {    
  46.             // 引用jar包的代码    
  47.             findClassJar(STARATEGY_PATH);    
  48.         }    
  49.     }  
  50.       
  51.     /** 
  52.      * 本地查找 
  53.      * @param packName 
  54.      */  
  55.     private void findClassLocal(final String packName){  
  56.         URI url = null ;  
  57.         try {  
  58.             url = classLoader.getResource(packName.replace(".""/")).toURI();  
  59.         } catch (URISyntaxException e1) {  
  60.             throw new RuntimeException("未找到策略资源");  
  61.         }  
  62.           
  63.         File file = new File(url);  
  64.         file.listFiles(new FileFilter() {  
  65.                   
  66.                 public boolean accept(File chiFile) {  
  67.                     if(chiFile.isDirectory()){  
  68.                         findClassLocal(packName+"."+chiFile.getName());  
  69.                     }  
  70.                     if(chiFile.getName().endsWith(".class")){  
  71.                         Class<?> clazz = null;  
  72.                         try {  
  73.                             clazz = classLoader.loadClass(packName + "." + chiFile.getName().replace(".class"""));  
  74.                         } catch (ClassNotFoundException e) {  
  75.                             e.printStackTrace();  
  76.                         }  
  77.                         System.out.println(chiFile);  
  78.                         if(superStrategy.isAssignableFrom(clazz)){  
  79.                             eleStrategyList.add((Class<? extends String>) clazz);  
  80.                         }  
  81.                         return true;  
  82.                     }  
  83.                     return false;  
  84.                 }  
  85.             });  
  86.            
  87.     }  
  88.       
  89.     /** 
  90.      * jar包查找 
  91.      * @param packName 
  92.      */  
  93.     private void findClassJar(final String packName){  
  94.         String pathName = packName.replace(".""/");  
  95.         JarFile jarFile  = null;  
  96.         try {  
  97.             URL url = classLoader.getResource(pathName);  
  98.             JarURLConnection jarURLConnection  = (JarURLConnection )url.openConnection();  
  99.             jarFile = jarURLConnection.getJarFile();    
  100.         } catch (IOException e) {  
  101.             throw new RuntimeException("未找到策略资源");  
  102.         }  
  103.           
  104.         Enumeration<JarEntry> jarEntries = jarFile.entries();  
  105.         while (jarEntries.hasMoreElements()) {  
  106.             JarEntry jarEntry = jarEntries.nextElement();  
  107.             String jarEntryName = jarEntry.getName();  
  108.               
  109.             if(jarEntryName.contains(pathName) && !jarEntryName.equals(pathName+"/")){  
  110.                 //递归遍历子目录  
  111.                 if(jarEntry.isDirectory()){  
  112.                     String clazzName = jarEntry.getName().replace("/"".");  
  113.                     int endIndex = clazzName.lastIndexOf(".");   
  114.                     String prefix = null;    
  115.                     if (endIndex > 0) {    
  116.                         prefix = clazzName.substring(0, endIndex);    
  117.                     }    
  118.                     findClassJar(prefix);  
  119.                 }  
  120.                 if(jarEntry.getName().endsWith(".class")){  
  121.                     Class<?> clazz = null;  
  122.                     try {  
  123.                         clazz = classLoader.loadClass(jarEntry.getName().replace("/"".").replace(".class"""));  
  124.                     } catch (ClassNotFoundException e) {  
  125.                         e.printStackTrace();  
  126.                     }  
  127.                     if(superStrategy.isAssignableFrom(clazz)){  
  128.                         eleStrategyList.add((Class<? extends String>) clazz);  
  129.                     }  
  130.                 }  
  131.             }  
  132.               
  133.         }  
  134.            
  135.      }  
  136.       

转载地址:http://lqozl.baihongyu.com/

你可能感兴趣的文章
IntelliJ IDEA 源值1.5已过时,将在未来所有版本中删除
查看>>
【转】JSON格式简介及一些对应函数
查看>>
npm publish报错
查看>>
SWT之制作桌面程序主窗口(一)
查看>>
推荐一款代码神器,代码量至少省一半!
查看>>
浅谈AngularJS--域变量(scope)
查看>>
Java基础——数组例题&二维数组
查看>>
jquery-datatables
查看>>
Java集合<8> (Map)
查看>>
Linux chmod命令详解
查看>>
kubernetes部署rabbitmq集群
查看>>
机器学习基础---最大似然估计
查看>>
使用xtrabackup备份mysql8.0.16
查看>>
安装apache遇到的几个错误及解决办法 [error] Apache2.2: Service is already installed.
查看>>
Spring Security源码分析一:Spring Security认证过程
查看>>
Dubbo环境搭建
查看>>
[数据结构]插入排序与希尔排序
查看>>
如何高效利用GitHub
查看>>
Server-sent Event 简单介绍
查看>>
nginx 常用的几个命令
查看>>