黑马程序员-Java自定义类加载器

Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定的类:BootStrap、ExtClassLoader、AppClassLoader。
类加载器也是Java类,显然其他事java类的类加载器本身也要被累加器加载,显然必须有第一个类加载器不是java类,这正是BootStrap。
关系图:

例子:
1、要加载的类的代码
[java]  view plain copy
  1. public class ClassLoaderAttachment extends Date{  
  2.        public  String toString(){  
  3.               return "hello,itcast";     
  4.        }  
  5. }  


2、自己定义的类加载器
[java]  view plain copy
  1. public class MyClassLoadTest extends ClassLoader  {  
  2.   
  3.         public static void main(String[] args)throws Exception{  
  4.                String srcPath = "D:\\Users\\MyEclipse 10\\JavaEnhance\\bin\\com\\ysh\\day2\\ClassLoaderAttachment.class";  
  5.                System.out.println("11111111111111111111");  
  6.                String destDir = "itcastlib";  
  7.                FileInputStream fis = new FileInputStream(srcPath);  
  8.                String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);  
  9.                String destPath = destDir + "\\" + destFileName;  
  10.                FileOutputStream fos = new FileOutputStream(destPath);  
  11.                cypher(fis,fos);  
  12.                fis.close();  
  13.                fos.close();  
  14.                 //System.out.println(new ClassLoaderAttachment().toString());      
  15.        }  
  16.         //对.class文件加密,确保只能有自己的类加载器才能用  
  17.         private static void cypher(InputStream ips,OutputStream ops)throws Exception{  
  18.               int b = -1;  
  19.               while((b=ips.read())!=-1){  
  20.                   ops.write(b ^ 0xff);  
  21.               }  
  22.         }  
  23.         private String classDir;  
  24.         @Override//重写findClass方法,因为加载.class文件前要先解密。  
  25.         protected Class<?> findClass(String name) throws ClassNotFoundException{  
  26.                 System.out.println("12333");  
  27.                 String classFileName = classDir + "\\" + name.substring(name.lastIndexOf('.')+1) + ".class";  
  28.                 try{  
  29.                         FileInputStream fis = new FileInputStream(classFileName);  
  30.                         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  31.                         cypher(fis,bos);  
  32.                         byte[] bytes = bos.toByteArray();  
  33.                         return defineClass(bytes,0,bytes.length);  
  34.                 }catch(Exception e){  
  35.                       e.printStackTrace();  
  36.                 }  
  37.                return super.findClass(name);  
  38.         }  
  39.         //空的构造方法  
  40.         public MyClassLoadTest(){<span style="white-space:pre"> </span>  
  41.         }  
  42.         //重载的构造方法  
  43.         public MyClassLoadTest(String classDir){  
  44.                this.classDir = classDir;  
  45.         }  
  46. }  
3、测试自己的类加载器
[java]  view plain copy
  1. public class ClassLoadTest{  
  2.         public static void main(String[] args) throws Exception{  
  3.                 Class clazz = new MyClassLoadTest("itcastlib").loadClass("com.ysh.day2.ClassLoaderAttachment");  
  4.                 Date d = (Date)clazz.newInstance();  
  5.                 System.out.println(d);  
  6.         }  
  7. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值