8201443: NoSuchMethodException JarFile.open when jar file is used in classpath

Reviewed-by: rriggs, redestad
This commit is contained in:
Xueming Shen 2018-04-12 13:30:58 -07:00
parent b1a0746e11
commit 0b24f2acda

View file

@ -37,7 +37,6 @@ import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -52,13 +51,14 @@ import java.util.Set;
import java.util.Spliterator; import java.util.Spliterator;
import java.util.Spliterators; import java.util.Spliterators;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.IntFunction; import java.util.function.IntFunction;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
import jdk.internal.misc.JavaLangAccess;
import jdk.internal.misc.JavaUtilZipFileAccess; import jdk.internal.misc.JavaUtilZipFileAccess;
import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.SharedSecrets;
import jdk.internal.misc.VM; import jdk.internal.misc.VM;
@ -834,11 +834,10 @@ class ZipFile implements ZipConstants, Closeable {
static CleanableResource get(ZipFile zf, File file, int mode) static CleanableResource get(ZipFile zf, File file, int mode)
throws IOException { throws IOException {
Class<?> clz = zf.getClass(); Class<?> clz = zf.getClass();
while (clz != ZipFile.class) { while (clz != ZipFile.class && clz != JarFile.class) {
try { if (JLA.getDeclaredPublicMethods(clz, "close").size() != 0) {
clz.getDeclaredMethod("close");
return new FinalizableResource(zf, file, mode); return new FinalizableResource(zf, file, mode);
} catch (NoSuchMethodException nsme) {} }
clz = clz.getSuperclass(); clz = clz.getSuperclass();
} }
return new CleanableResource(zf, file, mode); return new CleanableResource(zf, file, mode);
@ -1101,6 +1100,8 @@ class ZipFile implements ZipConstants, Closeable {
} }
private static boolean isWindows; private static boolean isWindows;
private static final JavaLangAccess JLA;
static { static {
SharedSecrets.setJavaUtilZipFileAccess( SharedSecrets.setJavaUtilZipFileAccess(
new JavaUtilZipFileAccess() { new JavaUtilZipFileAccess() {
@ -1133,6 +1134,7 @@ class ZipFile implements ZipConstants, Closeable {
} }
} }
); );
JLA = jdk.internal.misc.SharedSecrets.getJavaLangAccess();
isWindows = VM.getSavedProperty("os.name").contains("Windows"); isWindows = VM.getSavedProperty("os.name").contains("Windows");
} }