/** Load class from this JAR only. */ private synchronized Class _loadClass(String clazz, boolean resolveIt) throws ClassNotFoundException { jar.activatePlugin(); synchronized (this) { Class cls = findLoadedClass(clazz); if (cls != null) { if (resolveIt) resolveClass(cls); return cls; } String name = MiscUtilities.classToFile(clazz); try { definePackage(clazz); ZipFile zipFile = jar.getZipFile(); ZipEntry entry = zipFile.getEntry(name); if (entry == null) throw new ClassNotFoundException(clazz); InputStream in = zipFile.getInputStream(entry); int len = (int) entry.getSize(); byte[] data = new byte[len]; int success = 0; int offset = 0; while (success < len) { len -= success; offset += success; success = in.read(data, offset, len); if (success == -1) { Log.log( Log.ERROR, this, "Failed to load class " + clazz + " from " + zipFile.getName()); throw new ClassNotFoundException(clazz); } } cls = defineClass(clazz, data, 0, data.length); if (resolveIt) resolveClass(cls); return cls; } catch (IOException io) { Log.log(Log.ERROR, this, io); throw new ClassNotFoundException(clazz); } } } // }}}
// {{{ definePackage(packageName, manifest) method private void definePackage(String name, Manifest mf) { if (mf == null) { definePackage(name, null, null, null, null, null, null, null); return; } Attributes sa = mf.getAttributes(name.replace('.', '/') + '/'); Attributes ma = mf.getMainAttributes(); URL sealBase = null; if (Boolean.valueOf(getMfValue(sa, ma, Name.SEALED)).booleanValue()) { try { sealBase = jar.getFile().toURL(); } catch (MalformedURLException e) { } } Package pkg = definePackage( name, getMfValue(sa, ma, Name.SPECIFICATION_TITLE), getMfValue(sa, ma, Name.SPECIFICATION_VERSION), getMfValue(sa, ma, Name.SPECIFICATION_VENDOR), getMfValue(sa, ma, Name.IMPLEMENTATION_TITLE), getMfValue(sa, ma, Name.IMPLEMENTATION_VERSION), getMfValue(sa, ma, Name.IMPLEMENTATION_VENDOR), sealBase); } // }}}
// {{{ definePackage(clazz) method private void definePackage(String clazz) throws IOException { int idx = clazz.lastIndexOf('.'); if (idx != -1) { String name = clazz.substring(0, idx); if (getPackage(name) == null) definePackage(name, new JarFile(jar.getFile()).getManifest()); } } // }}}