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

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;
	}

}
时间: 2024-10-28 16:22:32

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

加载指定包名下的所有类或根据类的annotation进行过滤的工具类

版权声明:本文为博主原创文章,未经博主允许不得转载.

动态加载jar包

一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ("helloworld"); } } 使用eclipse的export功能导出jar包,放在/Users/liqiu/Documents/workspace/HelloWorld.jar 二.编写调用jar包的类 package com.qunar.studyspring.javajar;

spring加载jar包中的多个配置文件[转载]

在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:beanconfigs/applicationContext_1.xml, classpath*:beanconfigs/applicationContext_2.xml, ...

java动态加载jar包,并运行其中的类和方法

动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一:定义一个抽象类 AbstractAction (稍后换成接口的实例) [java] view plain copy package com.java.loader; public abstract class AbstractAction { public abstract String actio

vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。

最近新装了2017,开始前几天还好, 可是最近在添加引用时,报错 ---------------------------Microsoft Visual Studio---------------------------未能正确加载"ReferenceManagerPackage"包. 此问题可能是因配置更改或安装另一个扩展导致的.可通过查看文件"C:\Users\Administrator\AppData\Roaming\Microsoft\VisualStudio\15.

关于Weblogic优先加载jar包的设置

<?xml version="1.0" encoding="UTF-8"?><weblogic-web-app> <container-descriptor>  <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor></weblogic-web-app> weblogic.xml 放到

遍历指定包名下所有的类(支持jar)(转)

支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClassLoader()获取ClassLoader实例将包名转为路径名后,做为参数传给CloassLoader.getResources(),以得到该路径下所有资源的URL;通过URL.getProtocol()方法,判断资源是在本地(file:)或是第三方jar包(jar:)内;在本地的类直接文件遍历即可;第三方jar则通过

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期 生命周期简介: servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法.这个实在服务器中new出来,然后用HashMap加的,与客户端无关.客户端之后访问只调用这个servlet的service方法. 具体分为4步: 1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次 2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次.并且可以通过config参数在 web.xml中通过(ke

未能正确加载“EditorPackage”包(转)

打开vs2012加载项目的时候报如下的错误: 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包.此问题可能是由配置更改或安装另一个扩展导致的.可以通过查看文件“C:\Users\zhanggj.PDOMAIN\AppData\Roaming\Microsoft\VisualStudio\11.0\ActivityLog.xml”来获取详细信息. 解决方法如下: 先关闭vs2012 然后打开开始菜单里面的 Dev