扩展ClassLoader定制类装载器

原创 2004年10月14日 17:43:00
    Java的ClassLoader与Package机制介绍了ClassLoader的委派机制,它是把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。其实这引出一个运行时包的概念。不同装载器装载的类,即使包名相同也不能互相访问。这样保证了核心类库不被破坏。

    本文将讲述如何扩展ClassLoader类实现一个自己的类装载器,每个Class对象都有一个引用指向装载他的ClassLoader,你可以通过public ClassLoader getClassLoader()方法得到它。为了创建自己的类装载器我们应该扩展ClassLoader类,这是一个抽象类。我们目的是从本地文件系统使用我们实现的类装载器装载一个类。我们创建一个FileClassLoader extends ClassLoader。我们需要覆盖ClassLoader中的
findClass(String name)方法,这个方法通过类的名字而得到一个Class对象。
    public Class findClass(String name)
    {
        byte[] data = loadClassData(name);
        return defineClass(name, data, 0, data.length);
    }
我们还应该提供一个方法loadClassData(String name),通过类的名称返回class文件的字节数组。然后使用ClassLoader提供的defineClass()方法我们就可以返回Class对象了。
    public byte[] loadClassData(String name)
    {
        FileInputStream fis = null;
        byte[] data = null;
        try
        {
            fis = new FileInputStream(new File(drive + name + fileType));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int ch = 0;
            while ((ch = fis.read()) != -1)
            {
                baos.write(ch);
              
            }
            data = baos.toByteArray();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
       
        return data;
    }
这里我们是从D盘装载一个类。

     下面我们提供一个类public class MyApp{},类中没有定义任何方法和变量,下面我们编译MyApp.java得到MyApp.class,然后把文件放在D盘的根目录。为了证明MyApp.class是被我们定义的classloader装载的,我们在FileClassLoader的main()方法中打印出装载MyApp.class的类装载器的名称。
    public static void main(String[] args) throws Exception
    {
        FileClassLoader loader = new FileClassLoader();
        Class objClass = loader.loadClass("MyApp", true);

        Object obj = objClass.newInstance();
        System.out.println(objClass.getName());
        System.out.println(objClass.getClassLoader());
     
            
     }
编译FileClassLoader
javac FileClassLoader.java  然后运行java FileClassLoader 可以看到输出结果为
MyApp
FileClassLoader@1a5ab41
如果你把MyApp.class放入到你程序的所在目录会出现什么情况呢?读者自己实践一下吧!下面给出FileClassLoader的源代码。
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileClassLoader extends ClassLoader
{
    public static final String drive = "d:/";
    public static final String fileType = ".class";
 
    public FileClassLoader() {
        super();
 
    }
 
    public FileClassLoader(ClassLoader arg0) {
        super(arg0);
    }
 
    public Class findClass(String name)
    {
        byte[] data = loadClassData(name);
        return defineClass(name, data, 0, data.length);
    }
 
    public byte[] loadClassData(String name)
    {
        FileInputStream fis = null;
        byte[] data = null;
        try
        {
            fis = new FileInputStream(new File(drive + name + fileType));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int ch = 0;
            while ((ch = fis.read()) != -1)
            {
                baos.write(ch);
              
            }
            data = baos.toByteArray();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
       
        return data;
    }
   
 
    public static void main(String[] args) throws Exception
    {
        FileClassLoader loader = new FileClassLoader();
        Class objClass = loader.loadClass("MyApp", true);

        Object obj = objClass.newInstance();
        System.out.println(objClass.getName());
        System.out.println(objClass.getClassLoader());
     
            
     }
}

JAVA反射机制深入学习(三)ClassLoader类装载器介绍

接下来介绍下JAVA中非常重要的一个类ClassLoader(类装载器) 类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。主要工作由ClassLoader及其子类负责,Clas...
  • icarus_wang
  • icarus_wang
  • 2016年05月29日 12:55
  • 881

类装载器——ClassLoader

类装载器——ClassLoader Java反射机制
  • m0_37105443
  • m0_37105443
  • 2017年04月12日 17:17
  • 164

ClassLoader——类装载器

首先看一下类装载器的工作机制 定义一:类装载器是寻找类的字节码文件并构造出类在JVM内部表示对象的组件。 在java中,类装载器将一个类装载到JVM中,要经过的步骤如下: 1.装载:查找和导入C...
  • zhuali_linkin
  • zhuali_linkin
  • 2012年06月04日 22:08
  • 300

类装载器ClassLoader

类装载器是寻找类的字节码(也就是class文件)文件并构造出类在JVM内部表示的对象组件。       类装载器把一个类装入JVM三个步骤 1、装载:查找导入class文件 2、链接:校验、准...
  • elapse008
  • elapse008
  • 2012年11月05日 23:00
  • 300

深入理解Java虚拟机 类加载子系统2

与C/C++那些需要在编译器期进行连接工作的语言不同,Java类的加载、连接和初始化都是在程序运行时完成的,只有在类被需要的时候才进行动态加载。1)JVM何时加载类? 有且只有以下5种情况: 创建新...
  • isunn
  • isunn
  • 2016年01月11日 13:03
  • 791

深入理解Java类加载器(ClassLoader)

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/73413292 出自【...
  • javazejian
  • javazejian
  • 2017年06月26日 09:34
  • 16086

类装载器ClassLoader工作机制

类装载器ClassLoader 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件。在Java 中, 类装载器把一个类装入JVM 中,要经过以下步骤: 1.装...
  • zshake
  • zshake
  • 2013年07月18日 17:25
  • 593

Java类装载器 ClassLoader

  • likaiwalkman
  • likaiwalkman
  • 2013年07月17日 11:58
  • 335

Tomcat研究之ClassLoader

Tomcat研究之ClassLoader 在研究Tomcat之前,一般是借用现有的UML工具分析Tomcat整体结构,但要分析Tomcat的流程就必须从分析Tomcat的StartUp入手。To...
  • chen77716
  • chen77716
  • 2004年07月05日 22:55
  • 6375

java学习之深入类加载器--ClassLoader

1.类加载器的原理 2.类加载器树状结构,双亲委托(代理)机制 3.自定义类加载器(文件,网络,加密) 4.线程上下文类加载器 5.服务器类加载原理和OSGI介绍 一、类加载器的作用 将class文...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月15日 21:19
  • 1927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扩展ClassLoader定制类装载器
举报原因:
原因补充:

(最多只允许输入30个字)