2

我正在尝试在以下位置找到的反射库: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)

最后一点,是否可以使用上述功能根据接口而不是超类来扫描类?谢谢。

4

3 回答 3

3

在您的代码中:

for(Class<? extends DetectorSub> detector:subTypes){

detector是一个实例Class<? extends DetectorSub>

进而:

DetectorSub d =(DetectorSub)detector.getClass().newInstance().cast(DetectorSub.class);

您正在调用getClass()detector也就是说,您正在Class<? extends DetectorSub>实例上调用 getClass() 并且您获得了代表的类对象,Class而不是 subType DetectorSub。因此,当您创建新实例时,实际上是在尝试创建 的新实例Class,但失败了,因为 的默认构造函数Class是私有的。

你应该改写:

DetectorSub d = detector.newInstance();
于 2013-03-03T18:53:08.817 回答
1

你的意思是?

DetectorSub d = (DetectorSub) detector.getDeclaredConstructors()[0].newInstance();

// or DetectorSub d = (DetectorSub) detector.newInstance();
// since it invokes the no-args constructor
于 2013-03-03T18:52:09.440 回答
0

在线的

DetectorSub d =(DetectorSub)detector.getClass().newInstance().cast(DetectorSub.class);

无需getClass()再次致电。它应该只是:

DetectorSub d =(DetectorSub)detector.newInstance().cast(DetectorSub.class);
于 2013-03-03T18:52:52.180 回答