我正在尝试在以下位置找到的反射库:https ://code.google.com/p/reflections/
我想要实现的是扫描我的项目中的包,然后创建在该包中找到的给定类型的所有子类的实例。我使用库的方式是正确的,因为 subTypes 返回以下内容:
[类标识符.DNSLookup、类标识符.AliasChecker、类标识符.GoogleSafeBrowsing]
尽管我的问题是如何创建在该集中找到的类的新实例。它们都有无参数的构造函数。
private void getDetectors(){
Reflections reflections = new Reflections("identifiers"); //name of package to scan
Set<Class<? extends DetectorSub>> subTypes =
reflections.getSubTypesOf(DetectorSub.class);
System.out.println(subTypes); // correct classes included here.
for(Class<? extends DetectorSub> detector:subTypes){
try {
DetectorSub d =(DetectorSub)detector.getClass().newInstance().cast(DetectorSub.class); //returns exceptions at runtime.
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
上面的代码返回以下异常:
java.lang.IllegalAccessException: Can not call newInstance() on the Class for java.lang.Class
at java.lang.Class.newInstance0(Class.java:339)
at java.lang.Class.newInstance(Class.java:327)
at core.PhishingScanner.getDetectors(PhishingScanner.java:40)
at core.PhishingScanner.<init>(PhishingScanner.java:28)
at core.Main.main(Main.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
最后一点,是否可以使用上述功能根据接口而不是超类来扫描类?谢谢。