虚无真的不可原谅吗?


问题内容

javadocVoid说:

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

但是构造函数很简单:

private Void() {}

这段代码实例化了Void

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

所以Void不是 不可实例。

是否有办法使Void真正无法实例化?


问题答案:

将构造函数设为私有,并且没有外部可以访问的任何其他构造函数,会使类 无法实例化

但是,您无法避免使用来访问它Reflection API。使用反射,您可以执行通常不允许的操作。

但是,如果你真的想你的类是 不可实例 ,甚至通过 反射 ,你可以throw一个 未经检查的异常构造函数

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

在这种情况下,使用Constructor#newInstance()方法创建实例时,它将抛出一个InvocationTargetException@注释中引用的。

这是Constructor#newInstance()method
的文档,它声明要抛出的异常列表,其中一个是InvocationTargetException,它说:-

throws:
InvocationTargetException-如果基础构造函数抛出异常。