Cd Chen's Services

ba ba ba la~~

Java Scan Classes in Packages...

以前若要掃描隸屬於某些 Package 的 Classes,非常的麻煩。很多人都喜歡用 Spring 來解決這個問題,但可能還是要類似這樣做:

try {
  for (String p : packages) {
    String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
      ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(p)) +
      "/" + CLASS_RESOURCE_PATTERN;

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

    for (Resource resource : resources) {
      if (resource.isReadable()) {
        MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);
        if (this.annotationFilter.match(metadataReader, metadataReaderFactory)) {
          persistentClasses.add(Class.forName(metadataReader.getAnnotationMetadata().getClassName()));
        }
      }
    }
  }
} catch (IOException ex) {
   throw new RuntimeException("I/O failure during classpath scanning", ex);
}

今天在「Spring util to scan classpath for annotated classes」這篇文章中,看到有人建議可以用 extcos 來試試看。剛剛看了 extcos 上一些基本介紹的文件後,發現可以這樣寫:

ComponentScanner scanner = new ComponentScanner();
 
Set<Class<?>> classes = scanner.getClasses(new ComponentQuery() {
    protected void query() {
        select().from(“foo”);
    }
});
 

看起來更簡潔、可讀性更高了!! 有機會一定要好好用一下~~

這篇內容的 Trackback 網址:

http://cdchen.idv.tw/trackback/1077