Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从多个私有构造函数中反映出一个私有构造函数_Java_Reflection_Constructor - Fatal编程技术网

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

Java 如何从多个私有构造函数中反映出一个私有构造函数,java,reflection,constructor,Java,Reflection,Constructor,我从硬盘上读到了一些工厂的课程 这些工厂没有公共施工人员,他们有2名私人施工人员: 一个用于反射的构造函数和一个用于创建的构造函数 这段代码在只有一个公共构造函数时工作,但实际上它抛出了一个奇怪的异常: public static void setupCalculators() { String calculatorsBasePackage = "feature.calculators"; ArrayList<String> res; try {

我从硬盘上读到了一些工厂的课程

这些工厂没有公共施工人员,他们有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();
    }
}
下面是抛出的异常:

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)
java.lang.NoSuchMethodException:feature.calculators.POS\u F\u Calculator$1.()
位于java.lang.Class.getConstructor0(未知源)
位于java.lang.Class.getDeclaredConstructor(未知源)
位于feature.CalculatorHandler.setupCalculators(CalculatorHandler.java:37)
位于driver.driver.main(driver.java:36)
我在想我做错了什么。此异常是什么意思?

公共构造函数getDeclaredConstructor(类…参数类型)
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
                                  throws NoSuchMethodException,
                                         SecurityException
抛出NoSuchMethodException, 安全例外

(类[])空


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

经过一点研究: 其中一个类中有一个可运行的实现,并被编译成一个匿名类 POS_F_计算器$1

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

构造函数c=klass.getDeclaredConstructor((类[])null);/*例外情况来了*/

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

专用位置计算器(结构表示法)

因此,通话内容应为:

Constructor<?> c = klass.getDeclaredConstructor(StructureRepresentation.class);
构造函数c=klass.getDeclaredConstructor(StructureRepresentation.class);

这是我在stack overflow中看到的建议和接受的东西之一,它不是一个语法错误,因为java编译并运行它…它不能处理这部分代码,没有它也不行…抱歉,我没有注意到我没有复制这两个构造函数。我的错。我已编辑了问题。答案未更改。您没有正确指定构造函数参数列表。很抱歉,您错了。列表的指定是正确的,在我忽略了内部类和匿名类(编译时带有$sign的类)之后,所有这些都非常有效。
Constructor<?> c = klass.getDeclaredConstructor(StructureRepresentation.class);