当前位置: 首页 > 知识库问答 >
问题:

使用反射创建新的类实例

闻人浩波
2023-03-14

我正在试验反射库发现:https://code.google.com/p/reflections/

我试图实现的是扫描项目中的一个包,然后创建在该包中找到的给定类型的所有子类的实例。我使用库的方式是正确的,因为子类型返回以下内容:

[class identifiers.DNSLookup,class identifiers.AliasChecker,class identifiers.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)

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

共有3个答案

谷梁波
2023-03-14

在线

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

无需再次调用getClass()。它应该是:

DetectorSub d =(DetectorSub)detector.newInstance().cast(DetectorSub.class);
阎唯
2023-03-14

你是说?

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

// or DetectorSub d = (DetectorSub) detector.newInstance();
// since it invokes the no-args constructor
万俟炯
2023-03-14

在您的代码中:

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

这里,检测器是类的一个实例

然后:

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

您正在对检测器调用getClass(),也就是说,您正在对类调用getClass()

你应该写:

DetectorSub d = detector.newInstance();
 类似资料:
  • 问题内容: 可以使用反射在抽象祖先类中创建派生类的实例吗? } 问题答案: 你可以这样做 版画 一种更常见的模式是使用Cloneable 版画 但是,应避免使用两者之一。通常,还有另一种方法可以满足您的需求,因此基础不会隐式地依赖于派生。

  • 问题内容: 给定班级价值: 我正在尝试使用创建该类的新实例: 从主要: 这不起作用,Eclipse的输出: 如果是这样,怎么可以用我创建了一个新的价值目标,在那里我调用的? 谢谢 问题答案: 您需要为此找到确切的构造函数。只能用于调用null构造函数。所以写

  • 我使用反射为我的 pojo 类创建了一个实例,如下所示: 当我打印时,我得到了以下字符串: < code > com . hex gen . ro . request . createrequisitionro @ 95c 7850[trans srlno = 实际上,所有值都设置为null,我希望为类中可用的setter设置值。因为setters名称可以随时更改,所以我计划动态设置值,这样就不会

  • 给定的类值: 我正在尝试使用创建该类的一个新实例: 如果是,我如何使用创建一个新的值对象,在这里我调用的? 谢谢

  • 问题内容: 我所考虑的所有示例都显示了如何创建一个未知实现的新实例,并将该实现投射到其接口。问题在于,现在您不能在实现类上调用任何新方法(只能重写),因为您的对象引用变量具有接口类型。这是我所拥有的: 如果我仅引用“ com.path.to.ImplementationType”,而我不知道该类型可能是什么(它来自配置文件),那么如何使用类名将其强制转换为实施类型?这有可能吗? 问题答案: 这行似

  • 问题内容: 如何使用反射创建内部类对象?内部和外部类均具有不带参数的默认构造函数 问题答案: “如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参见 Java™语言规范的 15.9.3节。” 这意味着您永远不能使用; 构造内部类。相反,您必须使用带有单个实例的构造函数。这是一些示例代码,演示其用法: (请注意,在标准Java术语中, 内部类 始终是非静态的。