如何获取不安全类的实例?
我总是得到安全例外。我列出了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;
}
(请不要试图告诉我使用这门课是多么不安全。)
答案 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