自定义类加载器

  1. package com;   
  2.   
  3. import java.io.*;   
  4. import java.net.*;   
  5. import java.util.*;   
  6. import java.lang.reflect.Method;   
  7.   
  8. public class CustomClassLoader extends URLClassLoader {   
  9.     private FileInputStream input = null;  //文件输入流   
  10.     private ByteArrayOutputStream out = null;  //字节数组输出流   
  11.     private String[] url = null;  //类文件加载路径   
  12.     private byte[] data = null//类文件字节码   
  13.     private String extensionalName = ""//类文件扩展名   
  14.   
  15.     public CustomClassLoader(URL[] urls) throws Exception{   
  16.         super(urls);   
  17.         this.url = new String[urls.length];   
  18.         for (int i = 0; i < urls.length; i++) {   
  19.              this.url[i] = urls[i].toURI().toString();   
  20.         }   
  21.     }   
  22.        
  23.     /*  
  24.      * 解析URL   
  25.      */  
  26.     private void setFilePath() {   
  27.         for (int i = 0; i < this.url.length; i++) {   
  28.             if (this.url[i].substring(0,4).toLowerCase().equals("file") == true) {   
  29.                 this.url[i] = this.url[i].substring(5);   
  30.             }   
  31.         }   
  32.     }   
  33.   
  34.     /*  
  35.      * 获得指定类名(包名+类名)文件的字节码  
  36.      * @name name String  
  37.      * @return byte[]  
  38.      */  
  39.     private byte[] getFileData(String name) {   
  40.         try {   
  41.             this.setFilePath();   
  42.             for (String url : this.url) {   
  43.                 String fileName = url + name.replace('.''/').concat(".") +   
  44.                                   this.getExtensionalName();   
  45.                 input = new FileInputStream(new File(fileName));   
  46.                 if (input != null) {   
  47.                     break;   
  48.                 }   
  49.             }             
  50.                
  51.             out = new ByteArrayOutputStream();   
  52.             data = new byte[1024];   
  53.             int len = -1;   
  54.             while ((len = input.read(data)) != -1) {   
  55.                 out.write(data, 0, len);   
  56.             }   
  57.             data = out.toByteArray();   
  58.         } catch (Exception e) {   
  59.             e.printStackTrace();   
  60.         } finally {   
  61.             try {   
  62.                 if (input != null)   
  63.                     input.close();   
  64.                 if (out != null)   
  65.                     out.close();   
  66.                 return data;   
  67.             } catch (Exception e) {   
  68.                 e.printStackTrace();   
  69.                 return null;   
  70.             }   
  71.         }   
  72.     }   
  73.   
  74.     /*  
  75.      * 根据指定类名查找类文件  
  76.      * @param name String  
  77.      * @return Class  
  78.      */  
  79.     protected Class findClassByName(String name) {   
  80.         try {   
  81.             byte[] data = this.getFileData(name);   
  82.             if (data == null) {   
  83.                 return null;   
  84.             }   
  85.             return this.defineClass(name, data, 0, data.length);   
  86.         } catch (Exception e) {   
  87.             e.printStackTrace();   
  88.             return null;   
  89.         }   
  90.   
  91.     }   
  92.   
  93.     /*  
  94.      * 重写loadClass()方法  
  95.      * @param name String  
  96.      * @return Class  
  97.      */  
  98.     public Class loadClass(String name) {   
  99.         Class c = null;           
  100.         try {   
  101.             c = super.loadClass(name);           
  102.         } catch (ClassNotFoundException e) {   
  103.             e.printStackTrace();   
  104.         } finally {   
  105.             if (c == null//父类默认方法没有加载到指定类时,使用自定义方法查找   
  106.                 c = this.findClassByName(name);   
  107.             return c;   
  108.         }   
  109.     }   
  110.   
  111.     public String getExtensionalName() {   
  112.         return extensionalName;   
  113.     }   
  114.   
  115.     public void setExtensionalName(String extensionalName) {   
  116.         this.extensionalName = extensionalName;   
  117.     }   
  118.   
  119.   
  120.   
  121.     public static void main(String[] args) throws Exception {   
  122.         URL[] url = new URL[] {new URL("file:e:/")}; //添加你想要加载类的路径   
  123.                                                      //网络或本地均可   
  124.         CustomClassLoader csl = new CustomClassLoader(url);   
  125.         csl.setExtensionalName("rs");   
  126.         Class c1 = csl.loadClass("com.demo");   
  127.         Object obj = c1.newInstance();   
  128.         Method method = c1.getMethod("printText"null);   
  129.         method.invoke(obj, null);   
  130.     }   
  131. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值