`
刘小小尘
  • 浏览: 61725 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java自定义ClassLoader实例代码

 
阅读更多

闲来无事,看看jvm,看到自定义的classLoder,就写了一个实例,希望对大家有所帮助,欢迎批评指正

首先,自定义的classloader需要继承java的classLoder类,同时覆写findClass方法,废话不说了,直接上代码

MyClassLoader:自定义的classloader

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * 自定义classloader
 * @author liuxiaochen
 *
 */
public class MyClassLoader extends ClassLoader
{
	String path = "d:\\";
	String name;
	String fileType = ".class";
	
	public MyClassLoader(String name) {
		super() ;
		this.name = name ;
	}
	
	public MyClassLoader(ClassLoader classloader, String name) {
		super(classloader) ;
		this.name = name ;
	}
	
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException
	{
		byte[] data = loadClassData(name) ;
		return defineClass(name, data, 0, data.length) ;
	}
	
	

	@Override
	public String toString()
	{
		return this.name ;
	}

	private byte[] loadClassData(String name)
	{
		byte[] data = null;
		InputStream in = null;
		ByteArrayOutputStream baos = null;
		try
		{
			this.name = this.name.replace(".", "\\");
			in = new FileInputStream(new File(path + name + fileType));
			
			baos = new ByteArrayOutputStream();
			int cnt = 0;
			while (-1 != (cnt = in.read()))
			{
				baos.write(cnt);
			}
			data = baos.toByteArray();
		} catch (FileNotFoundException e)
		{
			e.printStackTrace();
		} catch (IOException e)
		{
			e.printStackTrace();
		} finally
		{
			try
			{
				in.close() ;
				baos.close() ;
			} catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		
		return data;
	}

	public String getPath()
	{
		return path;
	}

	public void setPath(String path)
	{
		this.path = path;
	}
	
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException
	{
		MyClassLoader loader1 = new MyClassLoader("loader1") ;
		loader1.setPath("d:\\myapp\\loader1lib\\") ;
		
		MyClassLoader loader2 = new MyClassLoader(loader1, "loader2") ;
		loader2.setPath("d:\\myapp\\loader2lib\\") ;
		
		MyClassLoader loader3 = new MyClassLoader(null, "loader3") ;
		loader3.setPath("d:\\myapp\\syslib\\") ;
		
		System.out.println("-------------");
		test(loader1) ;
		System.out.println("-------------");
		test(loader2) ;
		System.out.println("-------------");
//		test(loader3) ;
	}
	
	public static void test(ClassLoader classloder) throws ClassNotFoundException, InstantiationException, IllegalAccessException
	{
		Class<?> classzz = classloder.loadClass("Sample") ;
		Object instance = classzz.newInstance() ;
	}
}

其实java的jdk上已经给了一个实例,如下,不过只是框架,代码啥的自己写就行,

网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例。示例实现如下: 

     class NetworkClassLoader extends ClassLoader {
         String host;
         int port;

         public Class findClass(String name) {
             byte[] b = loadClassData(name);
             return defineClass(name, b, 0, b.length);
         }

         private byte[] loadClassData(String name) {
             // load the class data from the connection
              . . .
         }
     }

好了,自定义的classLoder写好了

写两个测试的类,做一下

public class Sample
{
	public Sample() 
	{
		System.out.println("sample is loader by" + this.getClass().getClassLoader());
		new Dog() ;
	}
}

public class Dog
{
	public Dog() 
	{
		System.out.println("dog is loader by " + this.getClass().getClassLoader());
	}
}

行了,剩下的,就比较简单了,测试吧,把class文件分别放到设置好的路径下,试试自定义的classloder吧


不吝赐教


分享到:
评论

相关推荐

    Java虚拟机和Java程序的生命周期?

    提供了访问该类在方法去内的数据结构的接口。 类加载有类加载器完成: 类加载器分为:Java虚拟机自带的加载器和用户自定义的类加载器;...用户自定义的类加载器是ClassLoader类的实例,通过它来定制类的加载方式。

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    15.2.2 建立classloader实例 518 15.3 重点复习 520 15.4 课后练习 521 chapter16 自定义泛型、枚举与标注 523 16.1 自定义泛型 524 16.1.1 定义泛型方法 524 16.1.2 使用extends与? 525 16.1.3 使用...

    Java虚拟机JVM类加载初始化

    4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再被引用、即已经不可触及的时候,Class对象的生命周期结束。那么该类的方法区内的...

    java 面试题 总结

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....

    超级有影响力霸气的Java面试题大全文档

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....

    day021-反射和注解笔记和代码.rar

    Class 类的实例表示正在运行的 Java 应用程序中的类和接口; 枚举是一种类,注解(指的是注解Annotation)是一种接口; 每个数组都是 Class字节码类中的一个具体 对象 基本的 Java 类型(boolean、byte、...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    jmtrace

    jmtrace本项目实现了一个面向Java程序...在transformer中,首先排除由Boostrap Classloader的类, java包中的类和sun包中的类,然后使用适配器设计模式将其作为ClassReader的对象修改为自定义类ClassAdapter的实例。在

    Spring.3.x企业应用开发实战(完整版).part2

    3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...

    Android插件框架Android-Plugin-Framework.zip

    DexClassLoader的parent设置为宿主程序的classloader,即可将主程序和插件程序的class贯通 2、插件apk的资源 通过构造插件apk的AssetManager和Resouce类即可。 本项目最关键一点功能、也是和网上其他插件项目...

Global site tag (gtag.js) - Google Analytics