Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 416|回复: 0

[Java基础知识]java实现自定义的Classloader

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:44:52 | 显示全部楼层 |阅读模式
    自己开发了一个Classloader,继承自URLClassloader,希望对大家有所帮助 它可以做一般Classloader所必须做的事情,包括
    (1)根据Url加载类
    (2)如果本地的用file:///协议来获得的URL里面拿字节码的时候,过滤掉file:///
    (3)获取字节码
    (4)根据类名查找类文件
    (5)载入类
    1. import java.io.*;
    2. import java.net.*;
    3.     /**
    4.      * @author charles.wang
    5.      *
    6.      */
    7.     public class CustomClassLoader extends URLClassLoader {
    8.      
    9.         private FileInputStream input = null;    //文件输入流
    10.         private ByteArrayOutputStream out = null;//字节数组输出流
    11.         private String[] url = null;             //类文件加载路径
    12.         private byte[] data = null;              //类文件字节码
    13.         private String extensionName = "";       //类文件扩展名
    14.          
    15.         /**
    16.          *
    17.          * @param urls : 将被加载的类的url
    18.          */
    19.         public CustomClassLoader(URL[] urls)  throws Exception{
    20.             super(urls);
    21.             // TODO Auto-generated constructor stub
    22.             this.url = new String[urls.length];
    23.             for( int i=0;i< urls.length;i++){
    24.                 this.url[i] = urls[i].toURI().toString();
    25.             }
    26.         }
    27.          
    28.          
    29.         public FileInputStream getInput() {
    30.             return input;
    31.         }
    32.      
    33.      
    34.         public void setInput(FileInputStream input) {
    35.             this.input = input;
    36.         }
    37.      
    38.      
    39.         public ByteArrayOutputStream getOut() {
    40.             return out;
    41.         }
    42.      
    43.      
    44.         public void setOut(ByteArrayOutputStream out) {
    45.             this.out = out;
    46.         }
    47.      
    48.      
    49.         public String[] getUrl() {
    50.             return url;
    51.         }
    52.      
    53.      
    54.         public void setUrl(String[] url) {
    55.             this.url = url;
    56.         }
    57.      
    58.      
    59.         public byte[] getData() {
    60.             return data;
    61.         }
    62.      
    63.      
    64.         public void setData(byte[] data) {
    65.             this.data = data;
    66.         }
    67.      
    68.      
    69.         public String getExtensionName() {
    70.             return extensionName;
    71.         }
    72.      
    73.      
    74.         public void setExtensionName(String extensionName) {
    75.             this.extensionName = extensionName;
    76.         }
    77.          
    78.          
    79.          
    80.          
    81.         /**
    82.          * 解析URL,将file头去掉
    83.          */
    84.         private void setFilePath(){
    85.             for( int i=0; i< this.url.length;i++){
    86.                 if ( this.url[i].substring(0,4).toLowerCase().equals("file") == true){
    87.                     this.url[i] = this.url[i].substring(5);
    88.                 }
    89.             }
    90.         }
    91.             
    92.         /**
    93.          * 获得指定类名(全限定类名)文件的字节码
    94.          */
    95.         private byte[] getFileData(String name){
    96.          try{
    97.              this.setFilePath();
    98.              for(String url: this.url){
    99.                String fileName = url + name.replace(".","").concat(".")+ this.getExtensionName();
    100.                   input = new FileInputStream( new File(fileName));
    101.                     if(input != null){
    102.                         break;
    103.                     }            
    104.                 }
    105.                  
    106.                 out = new ByteArrayOutputStream();
    107.                 data = new byte[1024];
    108.                 int len = -1;
    109.                 while ( (len = input.read(data))  != -1){
    110.                     out.write(data,0,len);
    111.                 }
    112.                 data = out.toByteArray();
    113.             }catch(Exception e){
    114.                 e.printStackTrace();
    115.             }finally{
    116.                 try {
    117.                     if (input != null)
    118.                         input.close();
    119.                     if (out != null)
    120.                         out.close();
    121.                     return data;
    122.                 }catch (Exception e){
    123.                     e.printStackTrace();
    124.                     return null;
    125.                 }
    126.             }
    127.          
    128.         }
    129.          
    130.         /**
    131.          * 根据指定的类名查找类文件
    132.          * @param name
    133.          * @return
    134.          */
    135.         protected Class findClassByName (String name){
    136.             try{
    137.                 byte [] data = this.getFileData(name);
    138.                 if (data == null){
    139.                     return null;
    140.                 }
    141.                 return this.defineClass(name, data, 0,data.length);
    142.             }catch (Exception e){
    143.                 e.printStackTrace();
    144.                 return null;
    145.             }
    146.         }
    147.          
    148.         /**
    149.          * 重新写 loadClass() 方法
    150.          */
    151.         public Class loadClass (String name){
    152.             Class c = null;
    153.             try{
    154.                  c = super.loadClass(name);
    155.             }catch (ClassNotFoundException e){
    156.                 e.printStackTrace();
    157.             }finally {
    158.                 if (c ==null ){
    159.                     //父类的默认方法没有加载到指定类的话,那么使用自定义的方法去查找
    160.                     c = this.findClassByName(name);
    161.                 }
    162.                 return c;
    163.             }
    164.         }
    165.          
    166.          
    167.     }
    复制代码
    使用代码:
    1. import java.net.*;
    2. import java.lang.reflect.Method;
    3.     /**
    4.      * @author charles.wang
    5.      *
    6.      */
    7.     public class MainTest {
    8.      
    9.         /**
    10.          * @param args
    11.          */
    12.         public static void main(String[] args) throws Exception {
    13.             // TODO Auto-generated method stub
    14.             URL[] url = new URL[]{new URL("file:d:")};
    15.             //添加想要加载的类路径,网络或者本地均可
    16.             CustomClassLoader csl = new CustomClassLoader(url);
    17.             csl.setExtensionName("class");
    18.             Class cl = csl.loadClass("com.Demo");
    19.             Object obj = cl.newInstance();
    20.             Method method = cl.getMethod("printText", null);
    21.             method.invoke(obj, null);
    22.         }
    23.      
    24.     }
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 16:56 , Processed in 0.352986 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表