我已经实现jar包的动态加载,但加载未知的第三方jar包不能清楚,第三方包中哪个是子类,哪个是父类,这样在动态加载时 ,如果先加载子类会报找不到父类异常,请高手指教,您是如何解决这个问题地 *^_^*
解决方案 »
- java的IO流处理文件
- 用SWT实现一个输入text,需要做到和eclipse一样,左边有一个行数Linenumber显示
- 传值问题和TreeSet问题
- 论区(Programmer)13474690,诚招高手加盟(Asp,.NET,Php,Jsp,Java,网页3剑客等技术都可以互相
- 执行一个JAVA小程序的时候,出现下面这些提示,求教那是什么原因?谢了。
- 怎么读一个字符串或数字到指定地方?
- 极简单问题:安装了jdk1.2.1后该怎么配置系统启动文件????
- 这是什么意思呀?
- 为什么我安装了java3d-1_2_1_03-win32-directx-rt,没有找到J3D库?
- 高手帮帮我:如何将swing 的JTable的内容原封不动的打印出来?
- 如何用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);
}
}}
要加载的类名暂时是写死的