<div>前段时间做到权限这个模块,然后由于路径太多,然后就想到了注解这个神奇的东西,于是乎就将其写成了一个工具类,然后今天分享给大家,以供同样做权限的朋友们参考,共同学习,共同进步,不足之处,多多指教。
这个工具类主要就是自定义一个注解,然后通过这个工具类来把自定义注解里边的值也就是说我们做权限所要用到的路径获取到,然后动态的插入到数据库当中,这样就不必要我们一条一条的去用手写数据库。
使用这个工具类的前提必须得有一个自定义的注解,自定义注解前边我都写过了,所以这里就不再多说了。下面上工具类: </div>
package com.hotel.util;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hotel.entity.Power;
/**
*
* 2016年9月1日下午7:01:53
* hotel
* com.hotel.util
*/
public class GetAnnotationUtil {
/**
*
* getRequestMappingValue
* GetAnnotationUtil
* List<String>
* 2016年9月1日下午7:19:26
* 描述:获取注解的值
*/
public static List<Power> getRequestMappingValue(String packageName){
//创建对象
GetAnnotationUtil getAnnotationUtil = new GetAnnotationUtil();
//第一个class类的集合
List<Class<?>> classes = new ArrayList<Class<?>>();
//是否迭代循环
boolean recursive = true;
//获取包的名字,然后进行替换
String packageDirectoryName = packageName.replace(".", "/");
//定义一个枚举的集合,并且进行循环来处理这个目录下的文件
Enumeration<URL> directorys;
try {
//读取指定包下的所有类
directorys = Thread.currentThread().getContextClassLoader().getResources(packageDirectoryName);
while (directorys.hasMoreElements()) {
URL url = directorys.nextElement();
//得到协议的名称
String protocol = url.getProtocol();
//判断是否以文件的形式保存
if("file".equals(protocol)) {
//获取包的路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
//以文件的方式扫描整个包下的文件,并且添加到集合中
getAnnotationUtil.findClass(packageName, filePath, recursive, classes);
}
}
} catch (IOException e) {
e.printStackTrace();
}
List<Power> list = new ArrayList<Power>();
for (Class<?> clazz : classes) {
//获取类上边的RequestMapping注解的值
RequestMapping annotation = clazz.getAnnotation(RequestMapping.class);
//自定义一个字符串
String classAnnotation = "";
//判断是否为空,如果不为空则获取到RequestMapping的值
if(annotation != null) {
String[] value = annotation.value();
for (String string : value) {
classAnnotation=string;
}
}
//获取类下边的所有方法
Method[] mes = clazz.getMethods();
//循环遍历方法
for (Method method : mes) {
//获取方法上边的RequestMapping注解的值
RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
//获取自定义注解的值
RequestMappingName requestMappingName = method.getAnnotation(RequestMappingName.class);
//判断是否为空,如果两个都不为空的话,则添加到集合里边
if(requestMapping != null && requestMappingName != null) {
//得到的注解的value
String[] value = requestMapping.value();
//循环遍历
for (String string : value) {
Power power = new Power();
power.setPid(requestMappingName.num());
power.setPowerName(requestMappingName.name());
power.setUrl("/"+ classAnnotation+"/"+string+".action");
//添加到List集合中
list.add(power);
}
}
}
}
return list;
}
/**
*
* findClass
* GetAnnotationUtil
* void
* 2016年9月1日下午7:55:20
* 描述:获取包下所有的类
*/
public void findClass(String packageName, String filePath, final boolean recursive, List<Class<?>> classes) {
//获取此包的目录,建立一个文件
File file = new File(filePath);
//判断是否存在或者是否是目录,如果不存在或者不是目录就直接返回
if(!file.exists() || !file.isDirectory()) {
return;
}
//如果存在,就获取包下的所有文件,包括目录
File[] files = file.listFiles(new FileFilter() {
//自定义过滤规则,如果可以循环或者是以.class结尾的文件
public boolean accept(File pathname) {
return (recursive && pathname.isDirectory() || (pathname.getName().endsWith(".class")));
}
});
//循环遍历所有文件
for (File fe : files) {
//如果是目录则继续扫描
if(fe.isDirectory()) {
findClass(packageName + "." + fe.getName(), fe.getAbsolutePath(), recursive, classes);
}else {
//如果是Java类文件,去掉后面的.class只留下类名
String string = fe.getName().substring(0, fe.getName().length()-6);
try {
//添加到集合中去
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + string));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
义注解前边我都写过了,所以这里就不再多说了。下面上工具类: