0

我有一些从硬盘驱动器读取的工厂课程。

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

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

4

3 回答 3

0

构造函数 c = klass.getDeclaredConstructor((Class[])null); /* 这里出现异常 */

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

私有 POS_F_Calculator(StructureRepresentation 表示)

所以调用应该是:

Constructor<?> c = klass.getDeclaredConstructor(StructureRepresentation.class);
于 2013-08-26T08:10:51.613 回答
0

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

解决方案:由于有一个非常具体的命名,我将丢弃不使用该具体命名的类。

于 2013-08-26T08:05:41.667 回答
-1
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
                                  throws NoSuchMethodException,
                                         SecurityException

关联

(类[])空

. 您如何将null转换为class!?当 null 不是一个类时

于 2013-08-25T15:26:49.230 回答