jar 包class动态加载问题 ,请高手指教 !

billwindows 2006-04-06 03:37:01
我已经实现jar包的动态加载,但加载未知的第三方jar包不能清楚,第三方包中哪个是子类,哪个是父类,这样在动态加载时 ,如果先加载子类会报找不到父类异常,请高手指教,您是如何解决这个问题地 *^_^*
...全文
165 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
billwindows 2006-04-06
  • 打赏
  • 举报
回复
心得就是重写ClassLoader,入口直接走该类构造函数即可,里面运行的方法中的 jar 包名和
要加载的类名暂时是写死的
billwindows 2006-04-06
  • 打赏
  • 举报
回复
我书写的实现类如下:
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);
}
}

}
treeroot 2006-04-06
  • 打赏
  • 举报
回复
你如何实现的?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧