实际使用sun.misc.Unsafe有多安全?

 呜呀002_107_284 发布于 2023-02-11 18:23

我想知道实际使用的不安全性sun.misc.Unsafe.我想创建一个对象的代理,我拦截每个方法调用(但Object.finalize出于性能考虑而去的那个).为此,我用谷歌搜索了一下,并提出了以下代码片段:

class MyClass {
  private final String value;
  MyClass() {
    this.value = "called";
  }
  public void print() {
    System.out.println(value);
  }
}

@org.junit.Test
public void testConstructorTrespassing() throws Exception {
  @SuppressWarnings("unchecked")
  Constructor constructor = ReflectionFactory.getReflectionFactory()
      .newConstructorForSerialization(MyClass.class, Object.class.getConstructor());
  constructor.setAccessible(true);
  assertNull(constructor.newInstance().print());
}

我的考虑是:

尽管Java被宣传为Write一次,但在任何地方都可以运行,因为开发人员看起来就像写一次,在可控制的客户的运行时环境中运行一次

sun.misc.Unsafe被认为是Java 9中公共API的一部分

sun.misc.Unsafe从那时起,许多非Oracle虚拟机也会提供- 我猜 - 有很多库已经使用它了.这也使得这个班级不太可能消失

我永远不会在Android上运行该应用程序,所以这对我来说无关紧要.

有多少人实际上正在使用非Oracle VM?

我仍然想知道:还有其他原因我不应该使用sun.misc.Unsafe我没有想到的吗?如果你谷歌这个问题,人们宁愿回答一个未指定,因为它不安全,但我真的不觉得除了(非常不可能)该方法将有一天从Oracle VM消失的可能性.

我实际上需要创建一个对象而不需要调用构造函数来克服Java的类型系统.我不考虑sun.misc.Unsafe对性能的原因.

附加信息:我ReflectionFactory在示例中使用的是方便的,Unsafe最终委托给了.我知道像objenesis这样的库,但看看我发现的代码,他们基本上做了类似的事情,但在使用Java版本时检查其他方法,这对我来说无论如何也是如此,所以我想写四行是值得保存依赖.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有