JVM 自定义类加载器

创建自定义类加载器

package com.example.jvm.classloader;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * Created by Think on 2019/6/9.
 */
public class MyTest16  extends  ClassLoader{

    private String classLoadName;

    private final String fileExtension = ".class";

    public MyTest16(String classLoadName){
        super(); //将系统类加载器当做该类加载器的父加载器
        this.classLoadName = classLoadName;
    }

    public MyTest16(ClassLoader parent, String classLoadName){
        super(parent); //显示指定该类加载器的父加载器器
        this.classLoadName = classLoadName;
    }

    @Override
    public String toString() {
        return "[" + this.classLoadName + "]";
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] data = this.loadClassData(classLoadName);
        return  this.defineClass(classLoadName,data, 0, data.length);
    }

    private byte[] loadClassData(String name){
        InputStream is = null;
        byte[] data = null;
        ByteArrayOutputStream baos = null;

        try{
            this.classLoadName = this.classLoadName.replace(".","//");
            is = new FileInputStream(new File(name + this.fileExtension));
            baos = new ByteArrayOutputStream();
            int ch = 0;
            while ( -1 != (ch = is.read())){
                baos.write(ch);
            }
            data = baos.toByteArray();

        }catch (Exception ex){
            ex.printStackTrace();
        }finally {
            try {
                is.close();
                baos.close();
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }

        return  data;

    }

    public static void main(String[] args)  throws Exception{
        MyTest16 loader1 = new MyTest16("loader1");
        test(loader1);
    }


    public static  void test(ClassLoader classLoader) throws Exception {
        Class<?> clazz = classLoader.loadClass("com.example.jvm.classloader.MyTest1");
        Object object = clazz.newInstance();
        System.out.println(object);

    }
}

  打印结果

com.example.jvm.classloader.MyTest1@1540e19d

  

猜你喜欢

转载自www.cnblogs.com/linlf03/p/10995208.html