Java自定义的类加载器

一、类加载器类别 
 *  1.java虚拟机自带的加载器 
 *   根类加载器(Bootstrap,c++实现) 
 *    扩展类加载器(Extension,java实现) 
 *    系统类加载器(System,java实现) 
 *  2.用户自定义的类加载器 
 *    java.lang.ClassLoader的子类 

 *    用户可以定制类的加载方式


[java]  view plain  copy
 print ?
  1. /** 
  2.      * 一、ClassLoader加载类的顺序 
  3.      *  1.调用 findLoadedClass(String) 来检查是否已经加载类。 
  4.      *  2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。 
  5.      *  3.调用 findClass(String) 方法查找类。 
  6.      * 二、实现自己的类加载器 
  7.      *  1.获取类的class文件的字节数组 
  8.      *  2.将字节数组转换为Class类的实例 
  9.      * @author lei 2011-9-1 
  10.      */  
  11.     public class ClassLoaderTest {  
  12.         public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {  
  13.             //新建一个类加载器  
  14.             MyClassLoader cl = new MyClassLoader("myClassLoader");  
  15.             //加载类,得到Class对象  
  16.             Class<?> clazz = cl.loadClass("classloader.Animal");  
  17.             //得到类的实例  
  18.             Animal animal=(Animal) clazz.newInstance();  
  19.             animal.say();  
  20.         }  
  21.     }  
  22.     class Animal{  
  23.         public void say(){  
  24.             System.out.println("hello world!");  
  25.         }  
  26.     }  
  27.     class MyClassLoader extends ClassLoader {  
  28.         //类加载器的名称  
  29.         private String name;  
  30.         //类存放的路径  
  31.         private String path = "E:\\workspace\\Algorithm\\src";  
  32.         MyClassLoader(String name) {  
  33.             this.name = name;  
  34.         }  
  35.         MyClassLoader(ClassLoader parent, String name) {  
  36.             super(parent);  
  37.             this.name = name;  
  38.         }  
  39.         /** 
  40.          * 重写findClass方法 
  41.          */  
  42.         @Override  
  43.         public Class<?> findClass(String name) {  
  44.             byte[] data = loadClassData(name);  
  45.             return this.defineClass(name, data, 0, data.length);  
  46.         }  
  47.         public byte[] loadClassData(String name) {  
  48.             try {  
  49.                 name = name.replace(".""//");  
  50.                 FileInputStream is = new FileInputStream(new File(path + name + ".class"));  
  51.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  52.                 int b = 0;  
  53.                 while ((b = is.read()) != -1) {  
  54.                     baos.write(b);  
  55.                 }  
  56.                 return baos.toByteArray();  
  57.             } catch (Exception e) {  
  58.                 e.printStackTrace();  
  59.             }  
  60.             return null;  
  61.         }  
  62.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值