1.按照指定包扫描

2.按照指定注解类过滤

1.[代码]ClassScaner

package com.bswan;

import java.io.IOException;

import java.lang.annotation.Annotation;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

import java.util.Set;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.BeanDefinitionStoreException;

import org.springframework.context.ResourceLoaderAware;

import org.springframework.core.io.Resource;

import org.springframework.core.io.ResourceLoader;

import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import org.springframework.core.io.support.ResourcePatternResolver;

import org.springframework.core.io.support.ResourcePatternUtils;

import org.springframework.core.type.classreading.CachingMetadataReaderFactory;

import org.springframework.core.type.classreading.MetadataReader;

import org.springframework.core.type.classreading.MetadataReaderFactory;

import org.springframework.core.type.filter.AnnotationTypeFilter;

import org.springframework.core.type.filter.TypeFilter;

import org.springframework.util.ClassUtils;

import org.springframework.util.SystemPropertyUtils;

import core.plugin.table.Table;

import core.route.Controllers;

@SuppressWarnings({ "rawtypes", "unchecked" })

public class ClassScaner implements ResourceLoaderAware {

/**

* log

*/

private static Logger logger = Logger.getLogger(ClassScaner.class);

private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();

private final List includeFilters = new LinkedList();

private final List excludeFilters = new LinkedList();

private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(

this.resourcePatternResolver);

public ClassScaner() {

}

public void setResourceLoader(ResourceLoader resourceLoader) {

this.resourcePatternResolver = ResourcePatternUtils

.getResourcePatternResolver(resourceLoader);

this.metadataReaderFactory = new CachingMetadataReaderFactory(

resourceLoader);

}

public final ResourceLoader getResourceLoader() {

return this.resourcePatternResolver;

}

public void addIncludeFilter(TypeFilter includeFilter) {

this.includeFilters.add(includeFilter);

}

public void addExcludeFilter(TypeFilter excludeFilter) {

this.excludeFilters.add(0, excludeFilter);

}

public void resetFilters(boolean useDefaultFilters) {

this.includeFilters.clear();

this.excludeFilters.clear();

}

public static Set scan(String basePackage,Class extends Annotation>... annotations) {

ClassScaner cs = new ClassScaner();

for (Class anno : annotations){

cs.addIncludeFilter(new AnnotationTypeFilter(anno));

}

return cs.doScan(basePackage);

}

public static Set scan(String[] basePackages,Class extends Annotation>... annotations) {

ClassScaner cs = new ClassScaner();

for (Class anno : annotations){

cs.addIncludeFilter(new AnnotationTypeFilter(anno));

}

Set classes = new HashSet();

for (String s : basePackages){

classes.addAll(cs.doScan(s));

}

return classes;

}

public Set doScan(String basePackage) {

Set classes = new HashSet();

try {

String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage))+ "/**/*.class";

System.out.println(packageSearchPath);

Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);

for (int i = 0; i < resources.length; i++) {

Resource resource = resources[i];

System.out.println(resource.getFilename());

if (resource.isReadable()) {

MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);

if ((includeFilters.size() == 0 && excludeFilters.size() == 0)|| matches(metadataReader)) {

try {

classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));

} catch (ClassNotFoundException e) {

logger.error(e.getMessage());

}

}

}

}

} catch (IOException ex) {

throw new BeanDefinitionStoreException(

"I/O failure during classpath scanning", ex);

}

return classes;

}

protected boolean matches(MetadataReader metadataReader) throws IOException {

for (TypeFilter tf : this.excludeFilters) {

if (tf.match(metadataReader, this.metadataReaderFactory)) {

return false;

}

}

for (TypeFilter tf : this.includeFilters) {

if (tf.match(metadataReader, this.metadataReaderFactory)) {

return true;

}

}

return false;

}

public static void main(String[] args) {

Set set = ClassScaner.scan("com.bswan", Table.class,Controllers.class);

for (Class class1 : set) {

System.out.println(class1.getName());

}

}

}

java中扫描类_java类扫描相关推荐

  1. Java中通过代理对类进行修改

    JAVA中的静态代理.动态代理及JDK proxy和CGLIB.Javassist.ASM实践 简介 Java中对已经有的类进行修改,改变或调整其执行,这可以通过代理来实现.Java的class文件是 ...

  2. java 判断object类型_Java 类继承机制

    封装.继承.多态是面向对象的三大特征,"继承"最主要的目的是为了实现代码的可复用性.通过父类与子类的继承关系,子类继承了父类的成员函数和成员变量,提高了代码的重复利用率.同时,子类 ...

  3. java中的starts_Java Math类静态double nextAfter(double starts,double direction)示例

    java中的starts 数学类静态double nextAfter(双向启动,双向) (Math Class static double nextAfter(double starts , doub ...

  4. setyear java_如何在Java中创建不可变类

    如果对象在构造后无法更改,则该对象是不可变的.不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改. 在本文中,我们将定义在Java中创建不可变 ...

  5. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  6. java创建一个不可变对象_如何在Java中创建不可变类?

    java创建一个不可变对象 Today we will learn about the immutable class in Java. What are immutable classes? The ...

  7. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  8. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  9. Java中的网络编程类(TCPUDP)

    Java中的网络编程类 n Java.net包 – TCP协议 URL URLConnection Socket ServerSocket – UDP协议 DatagramPacket Datagra ...

  10. 【JAVA系列】Java中的包、类的继承、多态、抽象类与接口

    文章目录 前言 一.包及访问权限 1.什么是包? 2.如何导入包? 3.JDK中常见的包 4.包的访问控制权限 二.继承 1.继承的基本概念 2.继承时方法调用顺序 3.super和this关键字 4 ...

最新文章

  1. 设置session失效的几种方法
  2. 网站PC端跟移动端有哪些不同的区别所在?
  3. C++类模版------STL的原理
  4. jQuery效果之滑动
  5. 关联式容器(map,set,multimap,multiset)
  6. 架构系列一:大型项目架构演进过程
  7. find命令_用find命令查找文件目录
  8. Shell脚本编程之(三)执行方式差异(source, sh script, ./script)
  9. 阅读器关闭时尝试调用 Read 无效
  10. 电信公网ip和内网ip的区别_私有IP共有IP和弹性IP的区别
  11. 拓端tecdat|R语言中GLM(广义线性模型),非线性和异方差可视化分析
  12. c语言办公用品管理系统,恒达办公用品管理系统
  13. BUCK降压电路和BOOST升压电路
  14. FreeRtos在RH850 D1L芯片上移植
  15. Java数组排序的方法
  16. excel合并两列内容_办公实用Execl表格中按这个键可以快速合并两列单元格内容...
  17. 国外广告联盟前期需要准备的事情
  18. 长租公寓全员「戒掉」租金贷会怎样?
  19. 腾讯云MySQL备份本地恢复
  20. 洛谷P2404 自然数的拆分问题

热门文章

  1. mysql的本地id可以随便设置马_Mysql 都会遭受哪些方面的攻击?
  2. js产生页面内的顺序序列号
  3. 纯java程序jdbcjar包放在哪_oracle 11g jdbc jar包在哪个文件目录
  4. java+@api_java 常用API
  5. mysql 查询默认编码_查看及修改MYSQL默认编码
  6. 2021年广东新高考学业水平考试成绩查询,2021年1月广东高中学业水平考试成绩查询时间及入口...
  7. python sys模块详解_python之sys模块详解
  8. python常见的控制流结构有_【Python】控制流语句、函数、模块、数据结构
  9. Could not find acceptable representation
  10. webStorm关闭自动保存