jar 包class动态加载问题 ,请高手指教 ! 我已经实现jar包的动态加载,但加载未知的第三方jar包不能清楚,第三方包中哪个是子类,哪个是父类,这样在动态加载时 ,如果先加载子类会报找不到父类异常,请高手指教,您是如何解决这个问题地 *^_^* 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我书写的实现类如下:package com.sunrising.common.classloader;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.Enumeration;import java.util.Hashtable;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;public class MyClassLoader extends ClassLoader { Hashtable loadedClasses; public MyClassLoader() { loadedClasses = new Hashtable(); readJarFile(""); createJarClass(""); } private Hashtable readJarFile(String jarName){ ZipInputStream zistream; File file = new File("lib"+File.separator+"g.jar"); URL url = null; try { url = file.toURL(); } catch (MalformedURLException ex) { ex.printStackTrace(); } try { zistream = new ZipInputStream(url.openStream()); } catch(IOException e) { return null; } try { ZipEntry classEntry; while((classEntry = zistream.getNextEntry()) != null) { String className = classEntry.getName().replaceAll("/", "."); if(className.endsWith(".class")) { byte data[] = readClassBytesFromInputStream(zistream); if(data != null) { loadedClasses.put(className, data); } } zistream.closeEntry(); } zistream.close(); } catch(IOException e) { return null; } return loadedClasses; } public synchronized void createJarClass(String className){ Hashtable loadedClasses = this.loadedClasses; Enumeration enum = null; Class newClass = null; String name = null; enum=loadedClasses.keys(); byte []classData =new byte[0]; if(!className.trim().equals("")){ className = className+".class"; classData = classData=(byte[])loadedClasses.get(className); newClass = defineClass(null, classData, 0, classData.length); loadedClasses.put(className,newClass); } while(enum.hasMoreElements()) { name=(String)enum.nextElement(); try{ classData=(byte[])loadedClasses.get(name); newClass = defineClass(null, classData, 0, classData.length); loadedClasses.put(name,newClass); }catch(Exception ex){ System.out.println(name+" has been create class"); } } } protected byte[] readClassBytesFromInputStream(InputStream istream) { ByteArrayOutputStream baostream = new ByteArrayOutputStream(); BufferedInputStream bistream = new BufferedInputStream(istream); try { byte buffer[] = new byte[1024]; int bytesRead; while((bytesRead = bistream.read(buffer, 0, 1024)) != -1) baostream.write(buffer, 0, bytesRead); buffer = null; } catch(IOException e) { return null; } return baostream.toByteArray(); } public synchronized Class loadClass(String className, boolean resolve) throws ClassNotFoundException { Class newClass = null; byte[] classData = null; newClass = (Class) loadedClasses.get(className); if (newClass != null) { if (resolve) resolveClass(newClass); return newClass; } try { newClass = findSystemClass(className); return newClass; } catch (ClassNotFoundException e) { System.out.println(className + " is not a system class!"); } try { classData = this.getLocalClassData(className); newClass = defineClass(null, classData, 0, classData.length); if (newClass == null) throw new ClassNotFoundException(className); } catch (Exception e) { this.createJarClass(className); } loadedClasses.put(className, newClass); if (resolve) { resolveClass(newClass); } return newClass; } protected byte[] getClassData(String className) throws IOException { byte[] data; int length; try { URL url = new URL(className.endsWith(".class") ? className : className + ".class"); URLConnection connection = url.openConnection(); InputStream inputStream = connection.getInputStream(); length = connection.getContentLength(); data = new byte[length]; inputStream.read(data); inputStream.close(); return data; } catch (Exception e) { throw new IOException(className); } } protected byte[] getLocalClassData(String className)throws IOException { byte[] data; int length; try { File file = new File("lib"+File.separator+className); URL url = file.toURL(); URLConnection connection = url.openConnection(); InputStream inputStream = connection.getInputStream(); length = connection.getContentLength(); data = new byte[length]; inputStream.read(data); inputStream.close(); return data; } catch (Exception e) { throw new IOException(className); } }} 心得就是重写ClassLoader,入口直接走该类构造函数即可,里面运行的方法中的 jar 包名和要加载的类名暂时是写死的 怎么把图片转换为字节数组。 java用纯文本做界面,如何运行》?? 关于Swing中用按钮做超链接 java编译包的问题 散分求JAVA运行环境搭建,来者有分 求 Advanced Java 2 Platform 源代码!!! 请教各位,初学者用什么工具编写Java程序比较好 我用jdbc访问Access数据库的时候,碰上个奇怪的现象 高手帮忙,我是初学者,为什么这个程序调不过去,高分相送,内容如下: java super的理解 如何用swing的布局实现简单的查询界面 一个关于数据库连接的问题
package com.sunrising.common.classloader;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class MyClassLoader extends ClassLoader {
Hashtable loadedClasses;
public MyClassLoader() {
loadedClasses = new Hashtable();
readJarFile("");
createJarClass("");
}
private Hashtable readJarFile(String jarName){
ZipInputStream zistream;
File file = new File("lib"+File.separator+"g.jar");
URL url = null;
try {
url = file.toURL();
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
try
{
zistream = new ZipInputStream(url.openStream());
}
catch(IOException e)
{
return null;
}
try
{
ZipEntry classEntry;
while((classEntry = zistream.getNextEntry()) != null)
{
String className = classEntry.getName().replaceAll("/", ".");
if(className.endsWith(".class"))
{
byte data[] = readClassBytesFromInputStream(zistream);
if(data != null)
{
loadedClasses.put(className, data);
}
}
zistream.closeEntry();
}
zistream.close();
}
catch(IOException e)
{
return null;
}
return loadedClasses;
}
public synchronized void createJarClass(String className){
Hashtable loadedClasses = this.loadedClasses;
Enumeration enum = null;
Class newClass = null;
String name = null;
enum=loadedClasses.keys();
byte []classData =new byte[0];
if(!className.trim().equals("")){
className = className+".class";
classData = classData=(byte[])loadedClasses.get(className);
newClass = defineClass(null, classData, 0, classData.length);
loadedClasses.put(className,newClass);
}
while(enum.hasMoreElements())
{
name=(String)enum.nextElement();
try{
classData=(byte[])loadedClasses.get(name);
newClass = defineClass(null, classData, 0, classData.length);
loadedClasses.put(name,newClass);
}catch(Exception ex){
System.out.println(name+" has been create class");
}
}
}
protected byte[] readClassBytesFromInputStream(InputStream istream)
{
ByteArrayOutputStream baostream = new ByteArrayOutputStream();
BufferedInputStream bistream = new BufferedInputStream(istream);
try
{
byte buffer[] = new byte[1024];
int bytesRead;
while((bytesRead = bistream.read(buffer, 0, 1024)) != -1)
baostream.write(buffer, 0, bytesRead);
buffer = null;
}
catch(IOException e)
{
return null;
}
return baostream.toByteArray();
} public synchronized Class loadClass(String className, boolean resolve)
throws ClassNotFoundException {
Class newClass = null;
byte[] classData = null;
newClass = (Class) loadedClasses.get(className);
if (newClass != null) {
if (resolve)
resolveClass(newClass);
return newClass;
}
try {
newClass = findSystemClass(className);
return newClass;
} catch (ClassNotFoundException e) {
System.out.println(className + " is not a system class!");
}
try { classData = this.getLocalClassData(className);
newClass = defineClass(null, classData, 0, classData.length);
if (newClass == null)
throw new ClassNotFoundException(className);
} catch (Exception e) {
this.createJarClass(className);
}
loadedClasses.put(className, newClass);
if (resolve) {
resolveClass(newClass);
}
return newClass;
}
protected byte[] getClassData(String className) throws IOException {
byte[] data;
int length;
try {
URL url = new URL(className.endsWith(".class") ? className
: className + ".class");
URLConnection connection = url.openConnection();
InputStream inputStream = connection.getInputStream();
length = connection.getContentLength();
data = new byte[length];
inputStream.read(data);
inputStream.close();
return data;
} catch (Exception e) {
throw new IOException(className);
}
}
protected byte[] getLocalClassData(String className)throws IOException {
byte[] data;
int length;
try {
File file = new File("lib"+File.separator+className);
URL url = file.toURL();
URLConnection connection = url.openConnection();
InputStream inputStream = connection.getInputStream();
length = connection.getContentLength();
data = new byte[length];
inputStream.read(data);
inputStream.close();
return data; } catch (Exception e) {
throw new IOException(className);
}
}}
要加载的类名暂时是写死的