我想知道实际使用的不安全性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") Constructorconstructor = 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版本时检查其他方法,这对我来说无论如何也是如此,所以我想写四行是值得保存依赖.