一旦我通过反射成功加载类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);