如何从多个私人构造函数中反映私人构造函数
我从硬盘读取了一些工厂类。如何从多个私人构造函数中反映私人构造函数
那些工厂没有公共构造函数,它们有2个私有构造函数: 一个用于反射的构造函数和一个用于创建的构造函数。
此代码工作时,只有一个公共的构造,但因为它是它抛出一个奇怪的例外:
public static void setupCalculators()
{
String calculatorsBasePackage = "feature.calculators";
ArrayList<String> res;
try
{
res = ReflectionHelper.getClassNamesFromPackage(calculatorsBasePackage);
for (String file : res)
{
file = file.replace("/", "");
Class<?> klass = Class.forName(calculatorsBasePackage + "." + file);
//The exception happens on the following line:
Constructor<?> c = klass.getDeclaredConstructor((Class[])null);
c.setAccessible(true);
ICalculatorFactory calculatorFactory =
(ICalculatorFactory) c.newInstance((Object[])null);
addCalculator(file.replace("_Calculator", ""), calculatorFactory);
}
}
catch (IOException | ClassNotFoundException | SecurityException |
IllegalArgumentException | InstantiationException |
IllegalAccessException | InvocationTargetException |
NoSuchMethodException e)
{
e.printStackTrace();
}
}
这是要检查的类:
private POS_F_Calculator()
{
}
private POS_F_Calculator()
{
}
private POS_F_Calculator(StructureRepresentation representation)
{
this.representation = representation;
}
@Override
public ICalculator newCalculator(IRepresentation representation)
{
return new POS_F_Calculator((StructureRepresentation) representation);
}
这里是抛出的异常:
java.lang.NoSuchMethodException: feature.calculators.POS_F_Calculator$1.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at feature.CalculatorHandler.setupCalculators(CalculatorHandler.java:37)
at driver.Driver.main(Driver.java:36)
我'我试图弄清楚我做错了什么。这个例外是什么意思?
的一点点研究后: 其中一个类有它一个Runnable的实现,并编译成一个匿名类 POS_F_Calculator $ 1
解决方案: 既然有非常具体的命名我将丢弃不使用特定命名的类。
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
(类[])空
。你怎么投null到类!?当空是不是一类
构造函数c = klass.getDeclaredConstructor((Class [])null);/*这里是例外*/
这里你说你想要的构造函数有零参数。你实际上有构造函数有一个参数:
私人POS_F_Calculator(StructureRepresentation表示)
因此调用阅读:
Constructor<?> c = klass.getDeclaredConstructor(StructureRepresentation.class);
对不起,我没有注意到我没有复制这两个构造函数。我的错。我编辑了这个问题。 –
答案保持不变。您尚未正确指定构造函数参数列表。 – EJP
对不起,但你错了。该列表被正确指定,并且在我忽略内部类和匿名类(在编译时具有$符号的类)之后,所有工作都很好。 –
嗯,这是事情我”一在堆栈溢出中已经看到了提示并被接受,并且它不是一个语法错误,因为java编译并运行它...它不适用于这部分代码并且没有它... –
当然 您可以。您可以将null转换为任何内容。 -1 – EJP