虚无真的不可原谅吗?
问题内容:
的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-如果基础构造函数抛出异常。