`
刘小小尘
  • 浏览: 67496 次
  • 性别: 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 ClassLoader定制实例

    以"InternalsOfClassloadingSrc"为例,这可能是一个包含了自定义ClassLoader源代码的项目。在这个项目中,我们可以创建一个新的ClassLoader类,覆盖其`loadClass()`方法,实现我们的加载逻辑。我们可能需要读取...

    java自定义类加载classloader文档,包括代码

    ### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...

    java中classLoader的使用

    验证是为了确保即将执行的字节码符合Java虚拟机规范,防止恶意代码对系统的破坏。准备阶段会为类的静态变量分配内存并设置默认初始值,如int类型的变量默认值为0。解析阶段则主要处理符号引用转为直接引用。 **知识...

    探究java的ClassLoader及类变量初始化顺序

    自定义ClassLoader是Java灵活性的一个体现,开发者可以通过继承ClassLoader类并重写findClass()方法来自定义类的加载方式,例如从网络、数据库或者特定目录加载类。 接下来,我们讨论类变量初始化的顺序。Java中,...

    java中ClassLoader

    Java 中的 ClassLoader 是一个非常重要的组件,它负责动态加载 class 文件到虚拟机当中,并将其转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类,因此我们可以根据 Class 的实例可以得到...

    ClassLoader 案例

    在压缩包中的`MyClassLoader`文件,可能是实现自定义ClassLoader的源代码。这个类可能会包含以下部分: 1. 类加载器的实例化和配置,包括指定加载类的目录。 2. 对`loadClass()` 和 `findClass()` 的覆写,实现...

    ClassLoader类加载器

    在Java中,每个类都是由一个ClassLoader实例加载的。系统中存在三种基本的ClassLoader: 1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`&lt;JAVA_HOME&gt;/lib`目录下的核心类库,或者...

    了解Java ClassLoader

    Java程序中的每个类都由某个ClassLoader实例加载。 - JVM中有三个内置的ClassLoader:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoder。 - Bootstrap ClassLoader加载JDK的核心库,如rt.jar。 - ...

    Java SE: ClassLoader in depth

    对于标题“Java SE: ...- 模块化/插件化:对于需要模块化或插件化的应用程序,可以通过自定义ClassLoader实现模块的热加载或动态卸载。 深入理解ClassLoader机制对于开发大型、复杂或动态可扩展的Java应用非常重要。

    java自定义类加载器代码示例

    Java自定义类加载器代码示例 Java自定义类加载器代码示例是一种使用Java语言实现的类加载器示例,主要用于加载Java类文件。类加载器是Java虚拟机(JVM)中的一种机制,用于将Java类文件加载到JVM中,以便JVM可以...

    运用加密技术保护Java源代码

    下面将通过一个简单的示例来展示如何使用自定义ClassLoader来实现Java源代码的加密与解密。 1. **创建自定义ClassLoader**: - 自定义ClassLoader需要重写`findClass`方法来处理加密后的类文件。 - 在`findClass`...

    ava的ClassLoader介绍.doc

    Java的ClassLoader是Java虚拟机(JVM)的重要组成部分,它负责加载类到内存中以便执行。不同于C或C++程序,Java程序由...通过编写自定义ClassLoader,开发者可以灵活地扩展Java平台的能力,以适应各种各样的应用场景。

    如何有效防止Java程序源码被人偷窥.doc

    自定义ClassLoader的工作原理是,首先创建一个ClassLoader的实例,然后使用这个实例来加载特定的类。这样,JVM会使用我们的自定义加载器来处理类文件,包括解密操作。Listing 1展示了如何使用自定义ClassLoader加载...

    深入Java虚拟机_ClassLoader

    一个ClassLoader实例通常对应一个类加载的命名空间,一旦创建,其生命周期就开始了。除非应用程序显式卸载,否则ClassLoader通常不会被垃圾收集。 8. 热部署与类重加载: 在开发环境中,热部署允许开发者修改代码...

    java动态代理实例

    它需要三个参数:代理对象所实现的接口列表、一个`ClassLoader`(用于加载代理类)和一个`InvocationHandler`实例。这个方法会返回一个新的代理对象,该对象在运行时会动态生成一个实现了指定接口的类,这个类会将...

    ClassLoader 详解.doc

    自定义ClassLoader是Java平台的一大特色,开发人员可以根据需要创建自己的类加载器,例如实现模块化、热部署或者加密解密类等高级功能。自定义ClassLoader通常需要重写findClass()或loadClass()方法,以控制类的加载...

    ClassLoader实例

    要实现类的动态加载,开发者可以创建自定义类加载器,继承`java.lang.ClassLoader`类,并重写其`findClass`或`loadClass`方法。动态加载类通常应用于热更新、插件系统等场景,例如Tomcat和WebLogic服务器就是通过...

    java classLoader 的全面讲解

    三、自定义ClassLoader 1. 继承ClassLoader:为了实现特定的加载策略,如从网络加载类、从加密数据加载类等,可以继承ClassLoader并重写`findClass()`方法。 2. URLClassLoader:Java提供了一个内置的...

Global site tag (gtag.js) - Google Analytics