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



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

这是我的代码,总是抛出NoSuchMethodException:

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

如果您使用的是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);

相关内容

  • 没有找到相关文章

最新更新