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

时间:2013-08-25 15:08:38

标签: java reflection constructor

我正在从硬盘上读到一些工厂课程。

这些工厂没有公共建设者,他们有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)

我想弄清楚我做错了什么。这个例外是什么意思?

3 个答案:

答案 0 :(得分:0)

经过一番研究后: 其中一个类中有一个Runnable实现,并被编译为匿名类 POS_F_Calculator $ 1

解决方案: 由于存在非常具体的命名,因此我将丢弃不使用该特定命名的类。

答案 1 :(得分:0)

  

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

这里你要说的是你想要的构造函数没有参数。 实际拥有的构造函数有一个参数:

  

私人POS_F_Calculator(StructureRepresentation表示)

所以电话应该是:

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

答案 2 :(得分:-1)

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
                                  throws NoSuchMethodException,
                                         SecurityException

link

  

(类[])空

。如何将 null 投射到!当null不是类