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

Java 扫描包下所有类(包括jar包)的更多相关文章

  1. java在cmd下编译引用第三方jar包

    java在cmd下编译引用第三方jar包 转 https://blog.csdn.net/qq_21439971/article/details/53924594 获取第三方jar包 第三包我们可以引 ...

  2. java动态载入指定的类或者jar包反射调用其方法

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  3. java 查找指定包下的类

    package com.jason.test; import java.io.File; import java.io.IOException; import java.io.UnsupportedE ...

  4. Eclipse中将java类打成jar包形式运行

    记录一次帮助小伙伴将java类打成jar包运行 1.创建java project项目 file > new > project > java project 随便起一个项目名称,fi ...

  5. java.io 包下的类有哪些 + 面试题

    java.io 包下的类有哪些 + 面试题 IO 介绍 IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等. IO 分类 传统的 IO ...

  6. java项目中可能会使用到的jar包解释

    一.Struts2 用的版本是struts2.3.1.1 一个简单的Struts项目所需的jar包有如下8个 1. struts2-core-2.3.1.1.jar: Struts2的核心类库. 2. ...

  7. 【BUG】websphere找不到类或jar包冲突

    来自:http://liuwei1578.blog.163.com/blog/static/49580364200991572642653/ Jar包冲突问题是在大型Java软件开发中经常遇到的问题, ...

  8. JAVA、android中常用的一些jar包的作用

    正文: 这里主要介绍的是hibernate使用到的.jar Hibernate一共包括了23个jar包,令人眼花缭乱.本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进 ...

  9. java命令行从编译到打jar包到执行

     目录: 一. javac编译     1. 没有额外的jar包     2. 包含额外的jar包 二. jar打jar包 三. java运行     1. java命令执行     2. jar包执 ...

  10. Linux查找class类所在jar包

    1.说明 写代码或者定位问题的时候, 经常发生只知道类名不知道其所在jar包的问题, 在Eclipse中可以使用Ctrl+Shift+T查找类, 但是如果类所在的jar包不在Build Path中, ...

随机推荐

  1. 【R笔记】R语言利器之ddply

    ddply()函数位于plyr包,用于对data.frame进行分组统计,与tapply有些类似 准备数据 # 使用stringsAsFactors=F来防止data.frame把向量转为factor ...

  2. 每天一个linux命令12之top

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...

  3. Delphi 使窗体Showmodal后可以操作其他窗体

    对话框ShowModal之后不能操作其它窗口,实际上是因为Windows Disable了其它窗口.所以当你需要在模态对话框中访问其它已经可见的窗口时,需要用EnableWindow API来激活对应 ...

  4. python获取系统信息,

    1 操作系统系统综合信息cur_sysinfo=platform.uname()浏览器信息cur_browserinfo=self.driver.capabilities['version']浏览器新 ...

  5. subprocess使用,进入到某个目录下执行shell命令

    subprocess是用来fork一个子进程的.这个子进程可以运行一个外部程序. 函数: subprocess.call() subprocess.check_output() subprocess. ...

  6. Spring的学习(IoC,AOP)等

    下面这个系列是非常好的例子: http://www.yiibai.com/spring/spring-3-hello-world-example.html 正在看,把一些基础夯实. IoC可以从下面一 ...

  7. JNI之——在cmd命令行下编译执行C/C++源文件

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604269 一直用java来敲代码,java配置好jre路径之后.在cmd下编译 ...

  8. mybatis常用jdbcType数据类型以及对应的JavaType

    1.MyBatis 通过包含的jdbcType类型 BIT.FLOAT.CHAR .TIMESTAMP . OTHER .UNDEFINEDTINYINT .REAL .VARCHAR .BINARY ...

  9. hdoj-1213-How Many Tables【并查集】

    How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  10. 虚拟机oracle virtualbox 上安装centos6.5 网络设置

    上篇文章写到,在虚拟机上安装centos6.5,结果依照文章非常顺利的安装了,可是用yum安装软件的时候.报错,源有问题,不能下载,然后ping一下摆渡.非常悲催 dns解析不了,cat /etc/r ...