Void真的是无法证实的吗?

2022-09-01 15:03:58

Void 的 javadoc 说:

Void 类是一个无法证实的占位符类,用于保存对表示 Java 关键字 void 的 Class 对象的引用。

但构造函数很简单:

private Void() {}

此代码实例化了 :Void

Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor

所以不是没有根据的。Void

有没有办法让真正无法证实?Void


答案 1

Rohit说得很对,对于大多数用例来说,抛出一个异常是“足够好的”。但是,看起来甚至可以绕过它,使用sun.misc.Unsafe

公共本机对象分配实例(类 cls) 抛出实例化异常

分配实例但不运行任何构造函数。初始化类(如果尚未初始化)。

(请注意,我还没有实际测试这是否有效)


答案 2

使构造函数私有,并且没有任何其他可由外部访问的构造函数,会使类不可实例化

但是,您无法避免使用 访问它。使用反射,你可以做,这是正常不允许的。Reflection API

但是,如果你真的希望你的类是不可证实的,即使通过反射,你也可以从构造函数实现一个未检查的异常throw

private MyClass() {
    throw UnsupportedOperationException("Can't instantiate class");
}

在这种情况下,当您使用方法创建实例时,它将引发一个 InvocationTargetException,如 @Alex 注释中引用的那样。Constructor#newInstance()

这是构造函数#newInstance()方法的文档,它声明了要抛出的异常列表,其中之一是InvocationTargetException,它说: -

throws:
InvocationTargetException - 如果底层构造函数引发异常。