ClassUtil.java 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package jnpf.util;
  2. import org.springframework.beans.factory.BeanDefinitionStoreException;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.core.env.Environment;
  5. import org.springframework.core.env.StandardEnvironment;
  6. import org.springframework.core.io.Resource;
  7. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  8. import org.springframework.core.io.support.ResourcePatternResolver;
  9. import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
  10. import org.springframework.core.type.classreading.MetadataReader;
  11. import org.springframework.core.type.classreading.MetadataReaderFactory;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.util.ClassUtils;
  14. import java.io.IOException;
  15. import java.util.LinkedHashSet;
  16. import java.util.Set;
  17. import java.util.function.Predicate;
  18. /**
  19. *
  20. * @author JNPF开发平台组
  21. * @version V3.1.0
  22. * @copyright 引迈信息技术有限公司
  23. * @date 2021/3/12 15:31
  24. */
  25. @Component
  26. public class ClassUtil {
  27. private static Environment environment;
  28. private static ResourcePatternResolver resourcePatternResolver;
  29. private static MetadataReaderFactory metadataReaderFactory;
  30. @Autowired(required = false)
  31. public void setEnvironment(Environment environment) {
  32. ClassUtil.environment = environment;
  33. }
  34. @Autowired(required = false)
  35. public void setMetadataReaderFactory(MetadataReaderFactory metadataReaderFactory) {
  36. ClassUtil.metadataReaderFactory = metadataReaderFactory;
  37. }
  38. @Autowired(required = false)
  39. public void setResourcePatternResolver(ResourcePatternResolver resourcePatternResolver) {
  40. ClassUtil.resourcePatternResolver = resourcePatternResolver;
  41. }
  42. private static Environment getEnvironment() {
  43. if (environment == null) {
  44. environment = new StandardEnvironment();
  45. }
  46. return environment;
  47. }
  48. protected static String resolveBasePackage(String basePackage) {
  49. return ClassUtils.convertClassNameToResourcePath(getEnvironment().resolveRequiredPlaceholders(basePackage));
  50. }
  51. private static ResourcePatternResolver getResourcePatternResolver() {
  52. if (resourcePatternResolver == null) {
  53. resourcePatternResolver = new PathMatchingResourcePatternResolver();
  54. }
  55. return resourcePatternResolver;
  56. }
  57. private static MetadataReaderFactory getMetadataReaderFactory() {
  58. if (metadataReaderFactory == null) {
  59. metadataReaderFactory = new CachingMetadataReaderFactory();
  60. }
  61. return metadataReaderFactory;
  62. }
  63. public static Set<Class<?>> scanCandidateComponents(String basePackage, Predicate<Class> predicate) {
  64. Set<Class<?>> classes = new LinkedHashSet<>();
  65. try {
  66. String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
  67. resolveBasePackage(basePackage) + '/' + "**/*.class";
  68. Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
  69. for (Resource resource : resources) {
  70. MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
  71. Class cls = environment.getClass().getClassLoader().loadClass(metadataReader.getClassMetadata().getClassName());
  72. if(predicate.test(cls)){
  73. classes.add(cls);
  74. }
  75. }
  76. }
  77. catch (IOException ex) {
  78. throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
  79. } catch (ClassNotFoundException e) {
  80. throw new RuntimeException(e);
  81. }
  82. return classes;
  83. }
  84. }