自定义classloader完成JAVA热替换ITeye - 威尼斯人

自定义classloader完成JAVA热替换ITeye

2019-01-10 13:24:14 | 作者: 浩阔 | 标签: 这个,办法,自定义 | 浏览: 551

自定义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);//这个办法非常重要 
  if (null == clazz) {//如果在这个类加载器中都不能找到这个类的话,就真的找不到了 
 
  } 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
  return clazz; 
 
  } 
 
  /**
  * 把CLASS文件转成BYTE
  *
  * @throws Exception
  */ 
  private byte[] getClassFileBytes(File file) throws Exception { 
  //选用NIO读取 
  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(); 
  } 
 
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章