通过反射成功加载类sun.misc.Unsafe
后,我无法使用Java反射找到getUnsafe
方法作为声明的方法。为什么?我没有SecurityManager
。
这是我的代码,它始终抛出NoSuchMethodException
:
Class<?> c = Class.forName("sun.misc.Unsafe", false, getClass().getClassLoader());
Assert.assertNotNull(c.getDeclaredMethod("getUnsafe"));
答案 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);
注意:您可以预期这在以后的版本中不起作用。