如何从多个私人构造函数中反映私人构造函数

问题描述:

我从硬盘读取了一些工厂类。如何从多个私人构造函数中反映私人构造函数

那些工厂没有公共构造函数,它们有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 

link

(类[])空

。你怎么投null!?当空是不是一类

+0

嗯,这是事情我”一在堆栈溢出中已经看到了提示并被接受,并且它不是一个语法错误,因为java编译并运行它...它不适用于这部分代码并且没有它... –

+0

当然 您可以。您可以将null转换为任何内容。 -1 – EJP

构造函数c = klass.getDeclaredConstructor((Class [])null);/*这里是例外*/

这里你说你想要的构造函数有零参数。你实际上有构造函数有一个参数:

私人POS_F_Calculator(StructureRepresentation表示)

因此调用阅读:

Constructor<?> c = klass.getDeclaredConstructor(StructureRepresentation.class); 
+0

对不起,我没有注意到我没有复制这两个构造函数。我的错。我编辑了这个问题。 –

+0

答案保持不变。您尚未正确指定构造函数参数列表。 – EJP

+0

对不起,但你错了。该列表被正确指定,并且在我忽略内部类和匿名类(在编译时具有$符号的类)之后,所有工作都很好。 –