美文网首页
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