我正在试验反射库发现: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)
最后,是否可以使用上述功能根据类的接口而不是超类扫描类?谢谢
在线
DetectorSub d =(DetectorSub)detector.getClass().newInstance().cast(DetectorSub.class);
无需再次调用getClass()。它应该是:
DetectorSub d =(DetectorSub)detector.newInstance().cast(DetectorSub.class);
你是说?
DetectorSub d = (DetectorSub) detector.getDeclaredConstructors()[0].newInstance();
// or DetectorSub d = (DetectorSub) detector.newInstance();
// since it invokes the no-args constructor
在您的代码中:
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术语中, 内部类 始终是非静态的。