java自定义ClassLoader简单案例

自定义ClassLoader,继承ClassLoader,代码:

package testJvm;

import java.io.*;

/**
 * @author: Xu Xiang  @createTime: 2021/7/14 8:41
 * Description: 
 */
public class XuXiangClassLoader extends ClassLoader {
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        File file = new File("d:/test/", name.replaceAll(".", "/").concat(".class"));
        try {
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int b = 0;
            // 从文件里读出来,写到字节数组里
            while ((b = fis.read()) != 0) {
                baos.write(b);
            }
            // 转换成二进制的字节数组
            byte[] bytes = baos.toByteArray();
            baos.close();
            fis.close();
            // 将二进制东西转换成class类对象
            return defineClass(name, bytes, 0, bytes.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.findClass(name);
    }

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        XuXiangClassLoader xxClassLoader = new XuXiangClassLoader();
        Class aClass = xxClassLoader.loadClass("testJvm.Hello");
        Hello o = (Hello)aClass.newInstance();
        o.hello();
    }
}

其中,d盘目录下test文件下面的Hello.class的原java代码如下:

package testJvm;

/**
 * @author: Xu Xiang  @createTime: 2021/7/14 8:44
 * Description: 
 */
public class Hello {
    public void hello() {
        System.out.println("hello xuxiang!");
    }
}

运行main方法:

 以上;

 

posted @ 2021-07-14 09:20  丙炎  阅读(279)  评论(0)    收藏  举报