我已经实现jar包的动态加载,但加载未知的第三方jar包不能清楚,第三方包中哪个是子类,哪个是父类,这样在动态加载时 ,如果先加载子类会报找不到父类异常,请高手指教,您是如何解决这个问题地 *^_^*

解决方案 »

  1.   

    我书写的实现类如下:
    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);
            }
        }}
      

  2.   

    心得就是重写ClassLoader,入口直接走该类构造函数即可,里面运行的方法中的  jar 包名和
    要加载的类名暂时是写死的