文档章节

加载指定包名下的全部类以及指定annotation进行过滤的工具类

孟飞阳
 孟飞阳
发布于 2015/08/09 13:25
字数 382
阅读 68
收藏 1
package org.konghao.sys.kit;

import java.io.File;
import java.io.FileFilter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FilenameUtils;
import org.konghao.sys.org.model.SysException;

public class BasicSysKit {
	/**
	 * 把(22)(33)(55)取出形成List
	 * @param str
	 * @return
	 */
	public static List<Integer> braceStr2List(String str) {
		Pattern pattern = Pattern.compile("(\\d+)");
		Matcher m = pattern.matcher(str);
		List<Integer> list = new ArrayList<Integer>();
		while(m.find()) {
			list.add(Integer.parseInt(m.group()));
		}
		return list;
	}
	/**
	 * 判断对象是否为空
	 * @param obj
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isEmpty(Object obj) {
		if(obj==null) return true;
		if(obj instanceof String) {
			if("".equals(obj)) return true;
		}
		if(obj instanceof Collection<?>) {
			if(((Collection) obj).size()>0) return true;
		}
		return false;
	}
	
	/**
	 * 对两个list做合并
	 * @param baseList
	 * @param mergeList
	 */
	public static <N extends Object>void mergeList(List<N> baseList,List<N> mergeList) {
		for(N o:mergeList) {
			if(!baseList.contains(o)) {
				baseList.add(o);
			}
		}
	}
	
	/**
	 * load包名下的所有class
	 * @param p
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static List<Class> listByClass(String p) {
		try {
			List<Class> clzs = new ArrayList<Class>();
			String packagePath = p.replace(".", "/");
			URL url = Thread.currentThread().getContextClassLoader().getResource(packagePath);
			File file = new File(url.getPath());
			if(!file.exists()) throw new SysException("初始化的包名路径不正确");
			File []fs = file.listFiles(new FileFilter() {
				@Override
				public boolean accept(File pathname) {
					if(pathname.getName().endsWith(".class")) return true;
					return false;
				}
			});
			for(File f:fs) {
				String cname = p+"."+FilenameUtils.getBaseName(f.getName());
				Class clz = Class.forName(cname);
				clzs.add(clz);
			}
			return clzs;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * load指定包名下的含有指定annotation类型的类
	 * @param p
	 * @param an
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static List<Class> listByClassAnnotation(String p,Class an) {
		try {
			List<Class> clzs = new ArrayList<Class>();
			String packagePath = p.replace(".", "/");
			URL url = Thread.currentThread().getContextClassLoader().getResource(packagePath);
			File file = new File(url.getPath());
			if(!file.exists()) throw new SysException("初始化的包名路径不正确");
			File []fs = file.listFiles(new FileFilter() {
				@Override
				public boolean accept(File pathname) {
					if(pathname.getName().endsWith(".class")) return true;
					return false;
				}
			});
			for(File f:fs) {
				String cname = p+"."+FilenameUtils.getBaseName(f.getName());
				Class clz = Class.forName(cname);
				if(clz.isAnnotationPresent(an))
					clzs.add(clz);
			}
			return clzs;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
	
}

 

© 著作权归作者所有

孟飞阳
粉丝 217
博文 1056
码字总数 566359
作品 5
朝阳
个人站长
私信 提问
从0开始写JavaWeb框架系列(2)从0开始写SamrtFrameWork:开发一个类加载器

一、开发一个类加载器来加载基础包名下的所有类,如使用了某注解的类,或者实现了某接口的类,又或者继承了某父类的所有子类(编写一个工具类,四个注解类) 1.1、需要写一个ClassUtil工具类,...

AAASSSSddd
2016/05/27
90
0
Java常用工具类

集合操作工具类: 判断集合是否非空 判断集合是否为空 类加载器工具类: 获取类加载器: Thread.currentThread().getContextClassLoader()` 获取类路径 加载类(将自动初始化) 加载类 是否为...

MarkApple
2016/05/30
227
0
深入理解SpringBoot的过滤条件--AutoConfigure

我们知道在Spring及SpringBoot里按条件创建Bean的核心是接口与注解,其实在SpringBoot里还有一种AutoConfigure也可以来过滤配置,只不过这种技术,能够让SpringBoot更快速的启动,那么下面我们...

融科聂晨
2018/07/23
0
0
Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代XML配置文件。开发人员对注...

李长春
2011/10/08
1K
0
Spring注解详解2——【转】

接续上一篇博客,http://my.oschina.net/guanhe/admin/edit-blog?blog=609241 我们继续: 清单 17. 使用 @PostConstruct 和 @PreDestroy 注释的 Boss.java package com.baobaotao; import ja......

关河
2016/01/25
120
0

没有更多内容

加载失败,请刷新页面

加载更多

Echars鼠标点击事件多次触发

本文转载于:专业的前端网站➭Echars鼠标点击事件多次触发 gChart.on('click', function (params) { if (params.componentSubType == "bar" && params.componentType == "serie......

前端老手
20分钟前
3
0
springboot2.0.6(附) 解析META-INF/spring.factories通过系统加载类获取对应的 class 的全限定名称

在 SpringBoot中是通过getSpringFactoriesInstances(Class<T> type)方法获取所有classpath下面的META-INF/spring.factories文件,然后根据type值找到对应的 class 的全限定名称列表。下面我来...

小亮89
22分钟前
4
0
zk工厂方法实现NIOServerCnxnFactory

NIOServerCnxnFactory类 内部类 AbstractSelectThread AcceptThread SelectorThread 属性 ZOOKEEPER_NIO_SESSIONLESS_CNXN_TIMEOUT 10s session过期时间 ZOOKEEPER_NIO_NUM_SELECTOR_THREADS......

writeademo
25分钟前
3
0
天猫精灵业务如何使用机器学习PAI进行模型推理优化

作者:如切,悟双,楚哲,晓祥,旭林 引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备。天猫精灵目前是全球销量第三、中国...

阿里云官方博客
33分钟前
5
0
BJL技巧之大路馆擦法—《利辰逸》

很多朋友刚玩百佳时间不长,不知道如何看路,今 天我就来简单的讲下看大路的方法。 都是前辈教的,这里我只是简单复述一下。 大路的观察方法有以下几种: 先从庄闲的数量变化说起。 庄闲的强...

那女孩对我说
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部