package org.freeplane.plugin.workspace; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public final class JarClassLoader extends ClassLoader { private final ZipFile file; public JarClassLoader(String filename) throws IOException { this.file = new ZipFile(filename); } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { ZipEntry entry = this.file.getEntry(name.replace('.', '/') + ".class"); if (entry == null) { throw new ClassNotFoundException(name); } try { byte[] array = new byte[1024]; InputStream in = this.file.getInputStream(entry); ByteArrayOutputStream out = new ByteArrayOutputStream(array.length); int length = in.read(array); while (length > 0) { out.write(array, 0, length); length = in.read(array); } return defineClass(name, out.toByteArray(), 0, out.size()); } catch (IOException exception) { throw new ClassNotFoundException(name, exception); } } }