@
BBCCBB 不是新方法 而是 clean 的方法变了 没有兼容的代码直接拿到 jdk11 上运行会有 bug
private static Cleaner lookupCleanerJava9(MethodHandles.Lookup lookup) throws ReflectiveOperationException
{
Class<?> cleaner = Class.forName("java.lang.ref.Cleaner");
Class<?> cleanable = Class.forName("java.lang.ref.Cleaner$Cleanable");
MethodHandle create = lookup.findStatic(cleaner, "create", MethodType.methodType(cleaner));
Object theCleaner;
try {
theCleaner = create.invoke();
}
catch (Throwable t) {
throw new RuntimeException("Unable to create cleaner", t);
}
MethodHandle register = lookup.findVirtual(
cleaner,
"register",
MethodType.methodType(cleanable, Object.class, Runnable.class)
).bindTo(theCleaner);
MethodHandle clean = lookup.findVirtual(cleanable, "clean", MethodType.methodType(void.class));
return new CleanerImpl(register, clean);
}
private static Cleaner lookupCleanerJava8(MethodHandles.Lookup lookup) throws ReflectiveOperationException
{
Class<?> cleaner = Class.forName("sun.misc.Cleaner");
MethodHandle register = lookup.findStatic(
cleaner,
"create",
MethodType.methodType(cleaner, Object.class, Runnable.class)
);
MethodHandle clean = lookup.findVirtual(cleaner, "clean", MethodType.methodType(void.class));
return new CleanerImpl(register, clean);
}