2013-10-25 13 views
8

我目前使用反射從classes字段中獲取所有加載的類ClassLoader,然後檢查getPackage是否與我正在搜索的程序包相同。我遇到的一個問題是這些類沒有被ClassLoader加載,但我無法使用Class.forName自己加載它們,因爲我不知道這些類的名稱,因爲它們是動態加載的並且始終更改。這些類都有一個共同點,那就是它們擴展了Module。我將如何去加載一個包中的所有類?加載包中的每個類

在此先感謝。

+0

http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection似乎回答這個 – iluxa

+0

@iluxa我可以得到包中的所有類,但只有當他們加載 –

+1

解釋[這裏](http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection/520344#520344) – mithrandir

回答

0

使用reflections API它肯定有效。如果沒有,你可能會設置錯誤的方式。我只是編寫了這個示例,它獨立於任何類加載器打印了包中的所有類。

package com.test; 

import java.util.Arrays; 
import java.util.Iterator; 
import java.util.Set; 

import org.reflections.Reflections; 
import org.reflections.scanners.FieldAnnotationsScanner; 
import org.reflections.scanners.MemberUsageScanner; 
import org.reflections.scanners.MethodAnnotationsScanner; 
import org.reflections.scanners.MethodParameterNamesScanner; 
import org.reflections.scanners.MethodParameterScanner; 
import org.reflections.scanners.SubTypesScanner; 
import org.reflections.scanners.TypeAnnotationsScanner; 
import org.reflections.util.ClasspathHelper; 
import org.reflections.util.ConfigurationBuilder; 
import org.reflections.util.FilterBuilder; 

public class Runner { 

    public static void main(String[] args) { 
     Reflections reflections = new Reflections(); 
     FilterBuilder TestModelFilter = new FilterBuilder().include("com.test.*"); 

     reflections = new Reflections(new ConfigurationBuilder() 
       .setUrls(Arrays.asList(ClasspathHelper.forClass(Runner.class))).filterInputsBy(TestModelFilter) 
       .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner(), new FieldAnnotationsScanner(), 
         new MethodAnnotationsScanner(), new MethodParameterScanner(), new MethodParameterNamesScanner(), 
         new MemberUsageScanner())); 

     Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class); 
     System.out.println(allClasses); 
     for (Iterator it = allClasses.iterator(); it.hasNext();) { 
      Class<? extends Object> clazz = (Class<? extends Object>) it.next(); 
      System.out.println(clazz.getCanonicalName()); 
     } 
    } 

} 

我按意向添加了所有導入,因此您可以看到它使用的API。這對你有用嗎?

相關問題