美文网首页
ClassLoader类加载器的用法

ClassLoader类加载器的用法

作者: 手打小黑板 | 来源:发表于2020-02-12 10:27 被阅读0次
    package com.liming.classloader;
    
    import java.io.*;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class FileSystemClassLoader extends ClassLoader{
        private String rootDir;
    
        public FileSystemClassLoader(String rootDir) {
            this.rootDir = rootDir;
        }
    
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            Class<?> xlass = findLoadedClass(name);
            if (xlass != null) {
                return xlass;
            }else{
    
                try {
                    xlass = getParent().loadClass(name);
                    if (xlass != null) {
                        return xlass;
                    }else{
                        return null;//此处传出null对象,表明没有加载到类
                    }
                } catch (ClassNotFoundException e) {
                    byte[] classData = loadClassData(name);
                    if (classData == null) {
                        throw new ClassNotFoundException();
                    }else {
                        xlass = defineClass(name, classData, 0, classData.length);
                        if (classData == null) {
                            throw new ClassNotFoundException();
                        } else {
                            return xlass;
                        }
    
                        //  e.printStackTrace();
                    }
                }
    
            }
    
    
    
        }
    
        private byte[] loadClassData(String name){
            //need rootDir  name
            ByteArrayOutputStream baos=null;
    
            try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream((rootDir+name.replaceAll("\\.","/")+".class")));
            ) {
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024*8];
                int len;
    
                while ((len = bis.read(buffer,0,buffer.length))!=-1){
                    baos.write(buffer,0,len);
                }
                baos.flush();
    
            }catch(IOException e){
                e.printStackTrace();
            }
            return baos.toByteArray();
        }
    
    
    
        public static void main1(String[] args) {
            System.out.println("HelloWorld");
    
            FileSystemClassLoader fscl = new FileSystemClassLoader("C:/");
            //同一个类被不同的加载器加载,JVM会认为是不相同的类
    
            System.out.println(fscl.getClass().getClassLoader());
    
    
            try {
                Class<?> xlass = fscl.findClass("com.liming.javassist.DT");
                Class<?> xlass2 = fscl.findClass("java.lang.String");
    
                System.out.println(xlass.getClassLoader());
                System.out.println(xlass2.getClassLoader());
    
    
                Object o = xlass.getConstructor(int.class,String.class).newInstance(888,"Fuck");
                Method m = xlass.getMethod("test5");
    
                System.out.println(m.invoke(o));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
    
        }
        
    }
    
    
    

    相关文章

      网友评论

          本文标题:ClassLoader类加载器的用法

          本文链接:https://www.haomeiwen.com/subject/rpuqfhtx.html