使用反射检查时,为什么我的私有构造函数是公开的?

时间:2017-11-22 18:01:05

标签: java reflection private-constructor

我(在许多其他没有这个问题的Util类中)有一个FileUtil类,它没有通过私有构造函数的测试。

类定义是:

public final class FileUtil {

    /**
     * Hidden constructor to prevent instantiation.
     */
    private FileUtil() {
    }
    // ...
    // many static methods
}

如上所述,我还有许多其他类都经过了私有构造函数的测试。测试方法是:

@Test
public void testPrivateConstructor() throws Exception {
    Constructor<FileUtil> constructor = FileUtil.class.getDeclaredConstructor();
    Assert.assertTrue("Constructor is not private", Modifier.isPrivate(constructor.getModifiers()));
    constructor.setAccessible(true);
    constructor.newInstance();
}

但是对于这个类 - 并且只针对这个类 - isPrivate()方法返回false,如果检入调试器,构造函数确实显示为public。但是,如果尝试以编程方式调用构造函数,Eclipse会告诉我该方法不可见。

我正在使用Eclipse和Maven,问题在Eclipse中以及在调用Maven构建时在命令行上显示。所以它确实是一个Java问题,但是当我在我的库中使用这个模式没有问题时,我不明白它为什么只在这个类中失败。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

首先猜测;这些不是您正在寻找的FileUtil。

打印FileUtil.class.getName()。 例如:

System.out.println("FileUtil classname: " + FileUtil.class.getName());

答案 1 :(得分:0)

感谢您的回答。然而,问题是由完全不同的东西引起的:

在其他一些测试中,我不得不模拟这个类的一些方法。由于所有方法都是静态的,我必须使用

@PrepareForTest(FileUtil.class)
单元测试课上的

。我想这就是我在testPrivateConstructor()方法中使用公共构造函数获得模拟对象的原因。

我将所有需要模拟的测试重构为一个单独的测试类,并从包含testPrivateConstructor()方法的测试类中删除了@PrepareForTest(FileUtil.class)。现在它按预期工作。

希望如果有人再遇到同样的问题,这会有所帮助。