`
eddiegift
  • 浏览: 27453 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

自定义类加载器

    博客分类:
  • J2SE
阅读更多
package com;

import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.reflect.Method;

public class CustomClassLoader extends URLClassLoader {
    private FileInputStream input = null;  //文件输入流
    private ByteArrayOutputStream out = null;  //字节数组输出流
    private String[] url = null;  //类文件加载路径
    private byte[] data = null; //类文件字节码
    private String extensionalName = ""; //类文件扩展名

    public CustomClassLoader(URL[] urls) throws Exception{
        super(urls);
        this.url = new String[urls.length];
        for (int i = 0; i < urls.length; i++) {
             this.url[i] = urls[i].toURI().toString();
        }
    }
    
    /*
     * 解析URL 
     */
    private void setFilePath() {
        for (int i = 0; i < this.url.length; i++) {
            if (this.url[i].substring(0,4).toLowerCase().equals("file") == true) {
                this.url[i] = this.url[i].substring(5);
            }
        }
    }

    /*
     * 获得指定类名(包名+类名)文件的字节码
     * @name name String
     * @return byte[]
     */
    private byte[] getFileData(String name) {
        try {
            this.setFilePath();
            for (String url : this.url) {
                String fileName = url + name.replace('.', '/').concat(".") +
                                  this.getExtensionalName();
                input = new FileInputStream(new File(fileName));
                if (input != null) {
                    break;
                }
            }          
            
            out = new ByteArrayOutputStream();
            data = new byte[1024];
            int len = -1;
            while ((len = input.read(data)) != -1) {
                out.write(data, 0, len);
            }
            data = out.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (input != null)
                    input.close();
                if (out != null)
                    out.close();
                return data;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }

    /*
     * 根据指定类名查找类文件
     * @param name String
     * @return Class
     */
    protected Class findClassByName(String name) {
        try {
            byte[] data = this.getFileData(name);
            if (data == null) {
                return null;
            }
            return this.defineClass(name, data, 0, data.length);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /*
     * 重写loadClass()方法
     * @param name String
     * @return Class
     */
    public Class loadClass(String name) {
        Class c = null;        
        try {
            c = super.loadClass(name);        
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (c == null) //父类默认方法没有加载到指定类时,使用自定义方法查找
                c = this.findClassByName(name);
            return c;
        }
    }

    public String getExtensionalName() {
        return extensionalName;
    }

    public void setExtensionalName(String extensionalName) {
        this.extensionalName = extensionalName;
    }



    public static void main(String[] args) throws Exception {
        URL[] url = new URL[] {new URL("file:e:/")}; //添加你想要加载类的路径
                                                     //网络或本地均可
        CustomClassLoader csl = new CustomClassLoader(url);
        csl.setExtensionalName("rs");
        Class c1 = csl.loadClass("com.demo");
        Object obj = c1.newInstance();
        Method method = c1.getMethod("printText", null);
        method.invoke(obj, null);
    }
}

6
3
分享到:
评论
4 楼 eddiegift 2008-04-07  
不必特意配置,开发时放在你的WebRoot下的一个文件夹中就行
3 楼 eddiegift 2008-04-07  
这个自定义类加载器主要用于控制某个程序的一个关键类的只能在线加载,所以类文件本身不必太大
2 楼 雁行 2008-03-17  
自定义类加载器好写,如何配置到tomcat里似乎麻烦些
1 楼 wf_chn 2008-03-16  
你的class文件要是超过1k能加载成功吗

相关推荐

Global site tag (gtag.js) - Google Analytics