为什么使用Java反射找不到sun.misc.Unsafe#getUnsafe()?

时间:2015-05-18 21:26:08

标签: java reflection

通过反射成功加载类sun.misc.Unsafe后,我无法使用Java反射找到getUnsafe方法作为声明的方法。为什么?我没有SecurityManager

这是我的代码,它始终抛出NoSuchMethodException

Class<?> c = Class.forName("sun.misc.Unsafe", false, getClass().getClassLoader());
Assert.assertNotNull(c.getDeclaredMethod("getUnsafe"));

1 个答案:

答案 0 :(得分:4)

如果您使用的是Java 8,则会明确阻止您查看此方法和其他内部方法。请参阅sun.reflect.Reflection类。

在此课程的静态栏目下,您可以看到

Reflection.registerMethodsToFilter(Unsafe.class, new String[]{"getUnsafe"});

这为此方法添加了一个过滤器,因此不会通过反射显示。

在Java 9中,目的是使访问此类内部类更加困难。

目前,您仍然可以使用Java 9 build 63直接获取该字段。

Class<?> c = Class.forName("sun.misc.Unsafe", false, A.class.getClassLoader());
Field theUnsafe = c.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe u = (Unsafe) theUnsafe.get(null);
System.out.println("u= " + u);

注意:您可以预期这在以后的版本中不起作用。