Customize classloader to realize JAVA hot replacement

自定义classloader实现JAVA热替换

public class HotClassLoader extends ClassLoader { 
 
    public HotClassLoader() { 
        super(ClassLoader.getSystemClassLoader()); 
    } 
 
    private File objFile; 
 
    public File getObjFile() { 
        return objFile; 
    } 
 
    public void setObjFile(File objFile) { 
        this.objFile = objFile; 
    } 
 
    @Override 
    protected Class<?> findClass(String name) throws ClassNotFoundException { 
        //这个classLoader的主要方法 
        System.out.println("findClassfindClassfindClassfindClass"); 
        Class clazz = null; 
        try { 
            byte[] data = getClassFileBytes(getObjFile()); 
            clazz = defineClass(name, data, 0, data.length);//This method is very important 
            if (null == clazz) {//If in this class loader If you can't find this class, you can't really find it 
 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return clazz; 
 
    } 
 
    /**
     * Convert the CLASS file to BYTE
     *
     * @throws Exception
     */ 
    private byte[] getClassFileBytes(File file) throws Exception { 
        //Use NIO to read 
        FileInputStream fis = new FileInputStream(file); 
        FileChannel fileC = fis.getChannel(); 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        WritableByteChannel outC = Channels.newChannel(baos); 
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024); 
        while (true) { 
            int i = fileC.read(buffer); 
            if (i == 0 || i == -1) { 
                break; 
            } 
            buffer.flip(); 
            outC.write(buffer); 
            buffer.clear(); 
        } 
        fis.close(); 
        return baos.toByteArray(); 
    } 
 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325335059&siteId=291194637