如何获取 sun.misc.Unsafe 的实例?
Posted
技术标签:
【中文标题】如何获取 sun.misc.Unsafe 的实例?【英文标题】:How do I get the instance of sun.misc.Unsafe? 【发布时间】:2012-10-11 19:35:50 【问题描述】:如何获取不安全类的实例?
我总是遇到安全异常。我列出了 OpenJDK 6 实现的代码。我想弄乱sun.misc.Unsafe
提供给我的功能,但我总是最终得到SecurityException("Unsafe")
。
public static Unsafe getUnsafe()
Class cc = sun.reflect.Reflection.getCallerClass(2);
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
(请不要试图告诉我使用这个类有多不安全。)
【问题讨论】:
值得注意的是,这是故意未记录的,不仅因为它不安全,不是 Java API 的正式部分,也没有正式支持,而且还因为您打算“构建您的自己的光剑”:如果您自己无法弄清楚如何获取Unsafe
的实例,那么您可能对JVM 不够了解,无法使用 Unsafe
而不会引起问题.
【参考方案1】:
从baeldung.com,我们可以使用反射获取实例:
Field f =Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe) f.get(null);
编辑
以下引自这段代码所属项目的描述。
“所有这些示例和代码 sn-ps 的实现都可以在 GitHub 上找到——这是一个 Maven 项目,因此应该很容易导入和运行。”
【讨论】:
【参考方案2】:如果你使用Spring,你可以使用它的类UnsafeUtils
org.springframework.objenesis.instantiator.util.UnsafeUtils
public final class UnsafeUtils
private static final Unsafe unsafe;
private UnsafeUtils()
public static Unsafe getUnsafe()
return unsafe;
static
Field f;
try
f = Unsafe.class.getDeclaredField("theUnsafe");
catch (NoSuchFieldException var3)
throw new ObjenesisException(var3);
f.setAccessible(true);
try
unsafe = (Unsafe)f.get((Object)null);
catch (IllegalAccessException var2)
throw new ObjenesisException(var2);
【讨论】:
【参考方案3】:您可以在以下位置找到另一种方法:
http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
在不安全的源代码中,你可以找到:
@CallerSensitive
public static Unsafe getUnsafe()
Class<?> caller = Reflection.getCallerClass();
if (!VM.isSystemDomainLoader(caller.getClassLoader()))
throw new SecurityException("Unsafe");
return theUnsafe;
您可以使用 Xbootclasspath 将您的类或 jar 添加到引导类路径,如下所示:
java -Xbootclasspath:/usr/jdk1.7.0/jre/lib/rt.jar:. com.mishadoff.magic.UnsafeClient
【讨论】:
以上是关于如何获取 sun.misc.Unsafe 的实例?的主要内容,如果未能解决你的问题,请参考以下文章