扫描指定包下的所有类 package com.common.service;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annot
package com.common.service;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import com.common.VisitConfine;
import io.swagger.annotations.ApiOperation;
@Service
public class PackageScanService {
@Value("${server.context-path}")
private String serverContextPath;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private static final String RESOURCE_PATTERN = "**/%s/**/*.class";
private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
public List
scanAllClassFile(String basePackage){
String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
String.format(RESOURCE_PATTERN,ClassUtils.convertClassNameToResourcePath(basePackage));
List
result = new ArrayList
(); try{ Resource[] resources = this.resourcePatternResolver.getResources(pattern); MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver); for (Resource resource : resources) { if (resource.isReadable()) { MetadataReader reader = readerFactory.getMetadataReader(resource); Class
curClass = Thread.currentThread().getContextClassLoader().loadClass(reader.getClassMetadata().getClassName()); // 获取类上的RequestMapping RequestMapping classRequestMapping = curClass.getAnnotation(RequestMapping.class); String[] classReqPath = new String[]{}; if(null != classRequestMapping){ // 有可能类上没有注解 classReqPath = classRequestMapping.value(); } Method[] methods = curClass.getDeclaredMethods(); for(Method method : methods){ VisitConfine visitConfine = method.getAnnotation(VisitConfine.class); if(null != visitConfine && visitConfine.authed()){ // 只查找需要权限的方法 ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); String methodReqPath[] = method.getAnnotation(RequestMapping.class).value(); // 方法上的RequestMapping for(String str1: classReqPath){ for(String str2 : methodReqPath){ result.add(new com.common.entity.Resource(apiOperation.value(),serverContextPath + "/" + str1 + "/" + str2)); } } } } } } return result; }catch (Exception e) { e.printStackTrace(); logger.error("扫描提取[{}]包路径下,标记了注解[{}]的类出现异常", pattern); return null; } } }
