summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchibash <chiba@javassist.org>2016-07-14 19:53:29 +0900
committerchibash <chiba@javassist.org>2016-07-14 19:53:29 +0900
commit79785b83f263d90135dbcc5744deb44b27ae3665 (patch)
treed13ff238cb8302a617b306d0984f48986f9f5311
parentdfd5230a6eeae9fdc3debc3db26634db3062aa2d (diff)
downloadjavassist-79785b83f263d90135dbcc5744deb44b27ae3665.tar.gz
javassist-79785b83f263d90135dbcc5744deb44b27ae3665.zip
modifies ClassPool so that it can read most class files.
-rw-r--r--src/main/javassist/ClassClassPath.java39
-rw-r--r--src/main/javassist/ClassPoolTail.java3
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)