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

Java 为什么我的私有构造函数在使用反射检查时是公共的?,java,reflection,private-constructor,Java,Reflection,Private Constructor,我有一个类FileUtil(在许多其他没有这个问题的Util类中),它没有通过私有构造函数的测试 类别定义为: public final class FileUtil { /** * Hidden constructor to prevent instantiation. */ private FileUtil() { } // ... // many static methods } 如上所述,我还有许多其他类,它们都经过测试,可

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

类别定义为:

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();
}
@测试
public void testPrivateConstructor()引发异常{
构造函数=FileUtil.class.getDeclaredConstructor();
Assert.assertTrue(“构造函数不是私有的”,Modifier.isPrivate(Constructor.getModifiers());
constructor.setAccessible(true);
构造函数。newInstance();
}
但是对于这个类,并且仅对于这个类,isPrivate()方法返回false,如果在调试器中进行检查,则构造函数确实显示为public。但是,如果试图以编程方式调用构造函数,Eclipse会告诉我该方法不可见

我正在使用Eclipse和Maven,在调用Maven构建时,Eclipse和命令行中都会出现问题。所以这确实是一个Java问题,但是当我在整个库中毫无问题地使用这个模式时,我不明白为什么它只在这个类中失败


有什么想法吗?

先猜猜;这些不是您要查找的FileUtil

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

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

谢谢你的回答。但是,问题是由完全不同的原因造成的:

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

@PrepareForTest(FileUtil.class)
在单元测试类上。我想这就是我在testPrivateConstructor()方法中得到一个带有公共构造函数的模拟对象的原因

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


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

由于
FileUtil
是一个非常常见的名称,可能您使用的是不同的
FileUtil
类。在任何情况下,对于
isPrivate
,上述代码都不应为您提供
false
。您是否单独进行了测试?我做到了,而且效果很好,@tsolakp和@DwB的建议几乎肯定是正确的。。。您正在查看不同的
FileUtil
。对于像这样的东西,在发布前一定要做一个标记。如果你自己没有发现问题,那么当你发表文章时,你有了一些大家都可以快速复制和验证的东西。@JimGarrison谢谢你指出这一点。我在创建示例时找到了下面的解决方案;-)