使用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。這對你有用嗎?
http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection似乎回答這個 – iluxa
@iluxa我可以得到包中的所有類,但只有當他們加載 –
解釋[這裏](http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection/520344#520344) – mithrandir