我如何获得sun.misc.Unsafe的实例?

时间:2012-10-22 01:18:13

标签: java unsafe

如何获取不安全类的实例?

我总是得到安全例外。我列出了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;
}

(请不要试图告诉我使用这门课是多么不安全。)

3 个答案:

答案 0 :(得分:1)

baeldung.com,我们可以使用反射获得实例:

$ awk ' split($1,t,":") && $(NF+1)=t[1]t[2] ' monk.log | sort -k12 -n -k6  | awk ' !a[$NF] { a[$NF]++ ; NF--; print} '
16:06:02 0 3.03 0.00 6.06 5.00 0.00 0.00 0.00 0.00 0.00 90.91
16:07:02 0 3.03 0.00 6.06 9.00 0.00 0.00 0.00 0.00 0.00 90.91

编辑

以下引用了此代码所属项目的描述。

“所有这些示例和代码段的实现都可以在GitHub上找到-这是一个Maven项目,因此应该很容易直接导入和运行。”

答案 1 :(得分:0)

如果使用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);
        }
    }
}

答案 2 :(得分:0)

还有另一种方法可以找到:

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