我想知道使用
我实际上需要创建一个对象而不调用构造函数来克服Java的类型系统。出于性能原因,我不考虑使用
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<MyClass> constructor = ReflectionFactory.getReflectionFactory()
.newConstructorForSerialization(MyClass.class, Object.class.getConstructor());
constructor.setAccessible(true);
assertNull(constructor.newInstance().print());
}
我的看法是:
- 尽管Java被宣传为“一次编写,到处运行”,但是我作为开发人员的实际情况更像是“一次编写,在可控的客户端运行时环境中运行一次”
sun.misc.Unsafe
被认为将成为Java 9公共API的一部分- 许多非Oracle虚拟机也提供
sun.misc.Unsafe
,我猜这是因为有很多库已经在使用它。这也使这个类不太可能消失。 - 我永远不会在Android上运行该应用程序,所以这对我没有关系。
- 实际上有多少人使用非Oracle虚拟机呢?
sun.misc.Unsafe
?如果你在谷歌上搜索这个问题,人们会回答一个不明确的因为它不安全,但我并不真的觉得除了这个方法(非常不可能)有一天会从Oracle VM中消失之外还有别的原因。我实际上需要创建一个对象而不调用构造函数来克服Java的类型系统。出于性能原因,我不考虑使用
sun.misc.Unsafe
。
附加信息: 我在示例中使用 ReflectionFactory
仅为方便起见,它最终委托给 Unsafe
。我知道像 objenesis 这样的库,但看了代码后我发现它们基本上做了类似的事情,但在使用 Java 版本时会检查其他方法,这对我来说也不起作用,所以我想编写四行代码值得节省一个依赖项。
com.sun
包中。 - Jesper