【问题标题】:Is Void really uninstantiable?Void 真的无法实例化吗?
【发布时间】:2012-12-13 03:53:26
【问题描述】:

javadoc for Void 说:

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

但构造函数很简单:

private Void() {}

这段代码实例化了一个Void:

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

所以Void 不是不可实例化的。

有没有办法让Void 真正无法实例化?

【问题讨论】:

  • 出于好奇:你需要它吗? ;) 我猜它只是 returning void... 方法的反射 API 的占位符...也许只对代理有帮助?
  • 如果你使用反射,你可以做很多使用 API 做不到的事情。

标签: java reflection void


【解决方案1】:

Rohit 说得对,对于大多数用例来说,抛出异常“已经足够好”了。不过,貌似可以bypass even that, using sun.misc.Unsafe

公共原生对象 allocateInstance(Class cls) 抛出 实例化异常

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

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

【讨论】:

    【解决方案2】:

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

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

    但是,如果你真的希望你的类是uninstantiable,即使是通过Reflection,你可以throw一个Unchecked Exception 构造函数

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

    在这种情况下,当您使用Constructor#newInstance() 方法创建实例时,它将抛出InvocationTargetException,正如@Alex 在 cmets 中所引用的那样。

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

    抛出:
    InvocationTargetException - 如果底层构造函数 抛出异常。

    【讨论】:

    • 我认为不需要取消选中异常。如果它抛出一个检查过的也可以工作(也许java.lang.IllegalAccessException?)。
    • @matts 我认为这里最好使用未经检查的异常。一方面,它减少了代码(没有throws 子句),这总是一件好事。
    • 我认为选中与未选中的选择并不重要,无论如何,如果通过反射调用构造函数,它将被包装在 InvocationTargetException 中。
    • sun.misc.Unsafe 允许在不调用构造函数的情况下创建实例。编辑:在我发表评论之前没有阅读下面的答案。
    【解决方案3】:

    Reflection API 打破了各种这样的“规则”,就像能够修改final 字段一样。有很多抱怨说它可以让你打破 Java 的硬性规则,但事实就是这样。

    如果没有反射(或下面发布的@StevenSchlansker 的疯狂Unsafe API),就无法实例化。不过,只要允许反射,这些变通方法就会存在。

    Oracle's own Reflection tutorial 中,他们列出了优点和缺点。由您决定哪个更大。

    另外,请参阅此问题:What is reflection and why is it useful?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2016-06-09
      • 2020-10-26
      • 2016-11-22
      • 2016-02-29
      • 2017-01-29
      • 2020-08-30
      相关资源
      最近更新 更多