diff options
author | chibash <chiba@javassist.org> | 2016-07-14 19:53:29 +0900 |
---|---|---|
committer | chibash <chiba@javassist.org> | 2016-07-14 19:53:29 +0900 |
commit | 79785b83f263d90135dbcc5744deb44b27ae3665 (patch) | |
tree | d13ff238cb8302a617b306d0984f48986f9f5311 | |
parent | dfd5230a6eeae9fdc3debc3db26634db3062aa2d (diff) | |
download | javassist-79785b83f263d90135dbcc5744deb44b27ae3665.tar.gz javassist-79785b83f263d90135dbcc5744deb44b27ae3665.zip |
modifies ClassPool so that it can read most class files.
-rw-r--r-- | src/main/javassist/ClassClassPath.java | 39 | ||||
-rw-r--r-- | 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 <code>getResourceAsStream()</code> in <code>java.lang.Class</code>. @@ -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 <code>getResourceAsStream()</code>. */ - 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) |