博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
注解扫描工具
阅读量:6764 次
发布时间:2019-06-26

本文共 4198 字,大约阅读时间需要 13 分钟。

  hot3.png

package com.test.scaner;import static org.slf4j.LoggerFactory.getLogger;import java.io.File;import java.io.IOException;import java.lang.annotation.Annotation;import java.net.URL;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import com.google.common.collect.Lists;import eu.infomas.annotation.AnnotationDetector;import eu.infomas.annotation.AnnotationDetector.Reporter;import eu.infomas.annotation.AnnotationDetector.TypeReporter;/** *  * Created by linjinzhi on 2016/11/18 * */public class AnnotationScanUtils {		private static final Logger log = getLogger(AnnotationScanUtils.class);		private AnnotationScanUtils(){}		private static List
> supportAnnotationClasses = new ArrayList<>();//特定注解作用下的类类型列表 private static Map
, Class
> classesMap = null;//类类型-注解类型映射 /** * 初始化列表和Map * @param annotaionType 用户自定义注解类型. * @param supportAnnotationPackage 注解作用下的类所在包 */ private static void init(Class
annotaionType, String supportAnnotationPackage) { if(StringUtils.isNotBlank(supportAnnotationPackage)){ String[] sitenameClazzArray = StringUtils.split(supportAnnotationPackage, ";"); classesMap = scan(annotaionType, sitenameClazzArray); for(Entry
, Class
> entry : classesMap.entrySet()) { supportAnnotationClasses.add(entry.getKey()); } } } /** * 得到特定包下的特定注解作用的Class * @param annotaionType 要求扫描的注解类型 * @param supportAnnotationPackage 扫描的包名称,如果有多个,则以';'分隔 * @return 被特定注解作用且位于制定包下的所有具体类类型列表 */ public static List
> getSupportClasses(Class
annotaionType, String supportAnnotationPackage) { init(annotaionType, supportAnnotationPackage); return supportAnnotationClasses; } /** * 得到类类型-注解类型映射 * @return */ public static Map
, Class
> getObjectAnnotationMap(Class
annotaionType, String supportAnnotationPackage) { init(annotaionType, supportAnnotationPackage); return classesMap; } /** * 扫描类注解. * * @param annotationClass * @param packages * @return */ private static Map
, Class
> scan( final Class
annotationClass, String... packages) { final Map
, Class
> classesMap = new HashMap<>(); final Reporter reporter = new TypeReporter() { @SuppressWarnings("unchecked") @Override public Class
[] annotations() { return new Class[] { annotationClass }; } @Override public void reportTypeAnnotation( Class
annotation, String className) { try { classesMap.put(Class.forName(className), annotation); } catch (ClassNotFoundException e) { log.error("Class not found: {}", className, e); } } }; startScan(reporter, packages); return classesMap; } private static void startScan( final AnnotationDetector.Reporter reporter, String... packageNames) { final AnnotationDetector cf = new AnnotationDetector(reporter); try { if (packageNames.length == 0) { // 解决在web容器下扫描不到类的问题. URL url = Thread.currentThread().getContextClassLoader() .getResource(""); File file = new File(url.getPath()); File[] files = file.listFiles( (File pathname) -> pathname.isDirectory() && !pathname.isHidden() ); List
fileNames = Lists.newLinkedList(); for (File one : files) { fileNames.add(one.getName()); } log.debug("san path:{}", fileNames); cf.detect(fileNames.toArray(new String[fileNames.size()])); // 这里扫描全部可能会有性能问题 // XXX 在java项目中可以扫描到jar文件中的类,在web项目中不行. cf.detect(); } else { cf.detect(packageNames); } } catch (IOException e) { log.error("scan package error packages:{}", Arrays.toString(packageNames), e); } } /** * test * @param args */ public static void main(String[] args) { List
> classes = AnnotationScanUtils.getSupportClasses(Crawler.class, "com.test.scaner;"); for(Class
clazz : classes) { System.out.println(clazz); } Map
, Class
> map = AnnotationScanUtils.getObjectAnnotationMap(Crawler.class, "com.test.scaner;"); for(Entry
, Class
> entry : map.entrySet()) { System.out.println(entry.getKey()+"\t"+entry.getValue()); } }}

 

转载于:https://my.oschina.net/ChiLin/blog/787950

你可能感兴趣的文章
提升Mac os x 10.10+xcode6.1之后,Cocoapods发生故障的解决方案
查看>>
Developer Tool - 1. Text Tool and GNU/Linux Tool
查看>>
OAuth 2.0 安全案例回顾
查看>>
标准API使用小技巧
查看>>
jQuery Validate插入 reomte使用详细的说明
查看>>
科普:揭秘手机软件自启原理
查看>>
lintcode :搜索二维矩阵
查看>>
前端设计js+Tab切换可关闭+添加并自动判断是否已打开自动切换当前状态(转载)...
查看>>
for循环,如何结束多层for循环
查看>>
段树 基于单点更新 敌人阵容
查看>>
java中取得上下文路径的方法
查看>>
Tomcat通过配置一个虚拟路径管理web工程
查看>>
Spring、Hello Spring
查看>>
.net开发笔记(十三) Winform常用开发模式第一篇
查看>>
The Info-Button Standard: Bring Meaningful Use To the Patient
查看>>
python开发_tempfile
查看>>
无线网破解软件|一键式破解无线网|BT17软件包下载[笔记本+软件就行]
查看>>
centos 编译安装Apache 2.4
查看>>
Qt 槽函数的使用
查看>>
序言<EntityFramework6.0>
查看>>