通过扫描包路径获取包内class
public static Set<Class<?>> getClasses(ClassLoader classLoader, String pack) {
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
boolean recursive = true;
String packageName = pack;
// 包路径分隔符 . 换为 /
String packageDirName = packageName.replace('.', '/');
try {
Enumeration<URL> dirs;
if (classLoader == null) {
dirs = Thread.currentThread().getContextClassLoader()
.getResources(packageDirName);
} else {
dirs = classLoader.getResources(packageDirName);
}
while (dirs.hasMoreElements()) {
URL url = (URL) dirs.nextElement();
String protocol = url.getProtocol();
if ("file".equals(protocol)) {
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
findAndAddClassesInPackageByFile(packageName, filePath,recursive, classes);
} else if ("jar".equals(protocol)) {
try {
JarFile jar = ((JarURLConnection) url.openConnection())
.getJarFile();
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
String name = entry.getName();
if (name.charAt(0) == '/') {
name = name.substring(1);
}
if (name.startsWith(packageDirName)) {
int idx = name.lastIndexOf("/");
if (idx != -1) {
packageName = name.substring(0, idx).replace('/', '.');
}
if (((idx != -1) || (recursive)) && (name.endsWith(".class")) && (!entry.isDirectory())) {
String className = name.substring(packageName.length() + 1,name.length() - 6);
try {
classes.add(Thread.currentThread().getContextClassLoader().loadClass(
packageName + "." + className));
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
}
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return classes;
}
public static void findAndAddClassesInPackageByFile(String packageName,
String packagePath, final boolean recursive, Set<Class<?>> classes) {
File dir = new File(packagePath);
if ((!dir.exists()) || (!dir.isDirectory())) {
return;
}
File[] dirFiles = dir.listFiles(new FileFilter() {
public boolean accept(File file) {
return (recursive && (file.isDirectory())) || (file.getName().endsWith(".class"));
}
});
for (File file : dirFiles) {
if (file.isDirectory()) {
findAndAddClassesInPackageByFile(packageName + "." + file.getName(),file.getAbsolutePath(), recursive, classes);
} else {
String className = file.getName().substring(0,file.getName().length() - 6);
try {
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
}
}
通过扫描包路径获取包内class的更多相关文章
- Spring根据包名获取包路径下的所有类
参考mybatis MapperScannerConfigurer.java 最终找到 Spring的一个类 ClassPathBeanDefinitionScanner.java 参考ClassP ...
- Java扫描classpath指定包路径下所有class
在写框架时 经常需要扫描classpath指定包路径下带有某个Annotation的类,自己整理了一下 封装成一个工具类了,供大家参考. 源代码ClassPathResourceScanner.jav ...
- WAS下获取包路径下所有类
最近做javaweb项目的混淆工作,用到proguard,该工具混淆.jar文件比较方便,故把所有项目代码和配置文件打成jar包, 生成的jar包经过proguard处理后,再次打包(解决progua ...
- SpringCloud启动类指定扫描包路径
//如果这个启动类所在的包路径隐藏的很深,则需要指定扫描包.否则默认扫描启动类所在的子包路径下 @SpringBootApplication(scanBasePackages="com.jo ...
- SpringBoot集成Swagger2并配置多个包路径扫描
1. 简介 随着现在主流的前后端分离模式开发越来越成熟,接口文档的编写和规范是一件非常重要的事.简单的项目来说,对应的controller在一个包路径下,因此在Swagger配置参数时只需要配置一 ...
- 配置typeAliasesPackage支持通配符包路径扫描
mybatis的xml文件中需要写类的全限定名,较繁琐,可以配置自动扫描包路径给类配置别名,两种配置方式. 方式一: mybatis-config.xml中配置 <typeAliases> ...
- JAVA 扫描指定路径下所有的jar包,并保存所有实现固定接口的类型
private static Map<String, Object> loadAllJarFromAbsolute(String directoryPath) throws NoSuchM ...
- java工具类 获取包下所有类
extends:http://blog.csdn.net/jdzms23/article/details/17550119 package com.threeti.util; import java. ...
- Appium Android 获取包名和 Activity 的几种方法 (转)
本文档主要记录“获取包名和 Activity 的方法”,用于自动化测试时启动APP.以下方法主要来源于网络和社区同学的贡献,特此感谢! 1. 方法一: pm list package查看包名 adb ...
随机推荐
- TortoiseSVN下载,安装,配置,常用操作 svn教程
一. 首先在百度搜索并下载 TortoiseSVN 推荐从官网下载,软件分为32位和64位版本,下载时请根据自己的系统位数进行下载:
- 安装Chive提示CDbConnection failed to open the DB connection.
最近初学PHP,看到Chive这个好玩的数据库管理工具,在登录时遇到这样的错误提示信息: CDbConnection failed to open the DB connection. 我的PHP版本 ...
- WebView 和Animation冲突
当有WebView时,可能会出现 动画没有执行过程. 解决方法: child.setLayerType(View.LAYER_TYPE_HARDWARE, null); child.setAnimat ...
- hadoop2.2编程:DFS API 操作
1. Reading data from a hadoop URL 说明:想要让java从hadoop的dfs里读取数据,则java 必须能够识别hadoop hdfs URL schema, 因此我 ...
- \u202e
document.write('\u202e1\u202e2\u202e3')
- Navigation Drawer(导航抽屉)
目录(?)[-] 创建一个导航抽屉 创建抽屉布局 初始化抽屉列表 处理导航项选点击事件 监听导航抽屉打开和关闭事件 点击应用图标来打开和关闭导航抽屉 创建一个导航抽屉 导航抽屉是一个位于屏幕左侧边缘用 ...
- 你认为A和B所在方格颜色相同吗?
[你认为A和B所在方格颜色相同吗? ]据说全世界只有0.003%的人和photoshop能看出它们的颜色是相同的. 我属于那 99.9997% 的人...因为我不是神...
- HDU1394-Minimum Inversion Number
http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Ja ...
- EXT 组件一些属性与方法(Tree)
1.Ext.tree.TreePanel 主要配置项: root:树的根节点. rootVisible:是否显示根节点,默认为true. useArrows:是否在树中使用Vista样式箭头,默认为f ...
- selenium-webdriver的等待方法
Wait commands in WebDriver Listing out the different WebDriver Wait statements that can be useful fo ...