From 79785b83f263d90135dbcc5744deb44b27ae3665 Mon Sep 17 00:00:00 2001 From: chibash Date: Thu, 14 Jul 2016 19:53:29 +0900 Subject: [PATCH] modifies ClassPool so that it can read most class files. --- src/main/javassist/ClassClassPath.java | 39 ++++++++++++++++++++++---- src/main/javassist/ClassPoolTail.java | 3 +- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/javassist/ClassClassPath.java b/src/main/javassist/ClassClassPath.java index 3cb8790c..334d61e0 100644 --- a/src/main/javassist/ClassClassPath.java +++ b/src/main/javassist/ClassClassPath.java @@ -19,6 +19,8 @@ package javassist; import java.io.InputStream; import java.net.URL; +import javassist.bytecode.ClassFile; + /** * A search-path for obtaining a class file * by getResourceAsStream() in java.lang.Class. @@ -43,7 +45,10 @@ import java.net.URL; * @see LoaderClassPath */ public class ClassClassPath implements ClassPath { - private Class thisClass; + private static final boolean useJigsaw + = ClassFile.MAJOR_VERSION >= ClassFile.JAVA_9; + + private Class thisClass; /** Creates a search path. * @@ -70,9 +75,17 @@ public class ClassClassPath implements ClassPath { /** * Obtains a class file by getResourceAsStream(). */ - public InputStream openClassfile(String classname) { - String jarname = "/" + classname.replace('.', '/') + ".class"; - return thisClass.getResourceAsStream(jarname); + public InputStream openClassfile(String classname) throws NotFoundException { + String jarname = classname.replace('.', '/') + ".class"; + if (useJigsaw) + try { + return thisClass.getModule().getResourceAsStream(jarname); + } + catch (java.io.IOException e) { + throw new NotFoundException(classname, e); + } + else + return thisClass.getResourceAsStream('/' + jarname); } /** @@ -81,8 +94,22 @@ public class ClassClassPath implements ClassPath { * @return null if the class file could not be found. */ public URL find(String classname) { - String jarname = "/" + classname.replace('.', '/') + ".class"; - return thisClass.getResource(jarname); + String jarname = classname.replace('.', '/') + ".class"; + if (useJigsaw) + try { + InputStream is = thisClass.getModule().getResourceAsStream(jarname); + if (is == null) + return null; + else { + is.close(); + return new URL("jar:file:unknown.jar!/" + jarname); + } + } + catch (java.io.IOException e) { + return null; + } + else + return thisClass.getResource('/' + jarname); } /** diff --git a/src/main/javassist/ClassPoolTail.java b/src/main/javassist/ClassPoolTail.java index 2fd952b7..e2ace76e 100644 --- a/src/main/javassist/ClassPoolTail.java +++ b/src/main/javassist/ClassPoolTail.java @@ -234,7 +234,8 @@ final class ClassPoolTail { } public ClassPath appendSystemPath() { - return appendClassPath(new ClassClassPath()); + appendClassPath(new ClassClassPath()); + return appendClassPath(new ClassClassPath(CtClass.class)); } public ClassPath insertClassPath(String pathname) -- 2.39.5