From 5ca66bf1b520598e2cce4a9ab56ec5a83e493157 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 13 Oct 2011 17:56:17 +0200 Subject: [PATCH] load defined classes from memory rather than from disk --- .../com/intellij/ant/PseudoClassLoader.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java b/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java index b0b92553edda..97a4172d7b94 100644 --- a/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java +++ b/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java @@ -37,6 +37,25 @@ public class PseudoClassLoader { static final WeakHashMap myCache = new WeakHashMap(); final Map myDefinedClasses = new HashMap (); + final Map myDefinedClassesData = new HashMap (); + + private class MemoryClassLoader extends ClassLoader { + public MemoryClassLoader(URLClassLoader classpathLoader) { + super(classpathLoader); + } + + protected Class findClass(String name) throws ClassNotFoundException { + final byte[] data = (byte[])myDefinedClassesData.get(name); + if (data == null) { + throw new ClassNotFoundException(name); + } + return defineClass(name, data, 0, data.length); + } + + public URL findResource(String name) { + return super.findResource(name); + } + } public class PseudoClass { final String myName; @@ -165,10 +184,11 @@ public class PseudoClassLoader { } } - final URLClassLoader myLoader; + final MemoryClassLoader myLoader; public PseudoClassLoader(final URL[] classpath) { - myLoader = new URLClassLoader (classpath, null); + final URLClassLoader classpathLoader = new URLClassLoader(classpath, null); + myLoader = new MemoryClassLoader(classpathLoader); } public ClassLoader getLoader () { @@ -177,6 +197,7 @@ public class PseudoClassLoader { public void defineClass (final String internalName, final byte[] data) { myDefinedClasses.put(internalName, createPseudoClass(new ClassReader(data))); + myDefinedClassesData.put(internalName.replace('/', '.'), data); } private static class V extends EmptyVisitor {