找到指定包名上的所有class
package test;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanDefinitionStoreException;
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.util.ClassUtils;
public class FindTargetPackageClass {
private static Log logger = LogFactory.getLog(FindTargetPackageClass.class);
protected static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(
this.resourcePatternResolver);
private String resourcePattern = DEFAULT_RESOURCE_PATTERN;
public static void main(String[] args) throws Exception {
FindTargetPackageClass test = new FindTargetPackageClass();
System.out.println(test.findTargetClassNames("org.springframework.context.event"));
}
public Set<String> findTargetClassNames(String basePackage) {
Set<String> candidates = new LinkedHashSet<String>();
try {
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ ClassUtils.convertClassNameToResourcePath(basePackage)
+ "/" + this.resourcePattern;
Resource[] resources = this.resourcePatternResolver
.getResources(packageSearchPath);
for (int i = 0; i < resources.length; i++) {
Resource resource = resources[i];
MetadataReader metadataReader = this.metadataReaderFactory
.getMetadataReader(resource);
String clazzName = metadataReader.getClassMetadata().getClassName();
candidates
.add(clazzName);
logger.debug("Find Class " + clazzName);
}
} catch (IOException ex) {
throw new BeanDefinitionStoreException(
"I/O failure during classpath scanning", ex);
}
return candidates;
}
}