`
benx
  • 浏览: 276306 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java ClassLoader 小例子

    博客分类:
  • java
阅读更多

import java.io.*;
import java.lang.reflect.*;

/**
 * 
 * 这个例子中类加载顺序为BootstrapClassPath----ExtClassPath--SystemClassPath--CClassLoader
 * --DClassLoader
 * <p>
 * 如果不想加载的指定类可以把CClassLoader 的 super.findClass
 * 去掉,但是最好在前面加上findLoadedClass判断类是否已经加载过,防止重复加载
 * <p>
 * 一般而言编写classLoacer只需重载findClass方法即可,loadClass方法会调用findClass方法
 * <p>
 * 如果加载的不是一个class而是一个jar,可以使用URLClassLoader来加载jar包
 * <p>
 * 一般应该服务器会有热加载机制,每个应用服务器对webapp下面应用都会有自己的加载器,当class文件是否有修改,判断文件的lastModify()的修改时间,
 * 如果是修改过则重新加载文件
 * <p>
 * 
 * @author Administrator
 * 
 */
// 寻找C盘class
class CClassLoader extends ClassLoader {
	private final static String DIR_PATHC = "c:/java/";

	protected Class<?> findClass(String s) {
		Class cls = null;
		try {
			cls = super.findClass(s);
		} catch (ClassNotFoundException e1) {
		}
		if (cls != null) {
			System.out.println(super.getClass().getClassLoader() + "  find "
					+ s);
			return cls;
		} else {
			System.out.println(super.getClass().getClassLoader() + " not find "
					+ s);
		}
		byte[] bys = null;
		try {
			bys = getBytes(s);
			cls = defineClass(null, bys, 0, bys.length);
		} catch (IOException e) {
		}
		if (cls != null) {
			System.out.println("CClassLoader find " + s);
		} else {
			System.out.println("CClassLoader not find " + s);
		}
		return cls;
	}

	// 从本地读取文
	private byte[] getBytes(String className) throws IOException {
		String path = DIR_PATHC + className + ".class";
		File file = new File(path);
		long len = file.length();
		byte raw[] = new byte[(int) len];
		FileInputStream fin = new FileInputStream(file);
		int r = fin.read(raw);
		if (r != len) {
			throw new IOException("Can't read all, " + r + " != " + len);
		}
		fin.close();
		return raw;
	}
}

// 寻找D盘class
class DClassLoader extends CClassLoader {
	private final static String DIR_PATHD = "d:/java/";

	protected Class<?> findClass(String s) {
		Class cls = null;
		cls = super.findClass(s);
		if(cls != null ){
			return cls;
		}
		byte[] bys = null;
		try {
			bys = getBytes(s);
			cls = defineClass(null, bys, 0, bys.length);
		} catch (IOException e) {
			e.printStackTrace();
		}
		if (cls != null) {
			System.out.println("DClassLoader find " + s);
		} else {
			System.out.println("DClassLoader not find " + s);
		}
		return cls;
	}

	// 从本地读取文件
	private byte[] getBytes(String className) throws IOException {
		String path = DIR_PATHD + className + ".class";
		File file = new File(path);
		long len = file.length();
		byte raw[] = new byte[(int) len];
		FileInputStream fin = new FileInputStream(file);
		int r = fin.read(raw);
		if (r != len) {
			throw new IOException("Can't read all, " + r + " != " + len);
		}
		fin.close();
		return raw;
	}
}

public class ClassLoaderTest {
	public static void main(String[] args) throws Exception {
		DClassLoader loader = new DClassLoader();

		// Class c = loader.loadClass("java.lang.String"); Object o =
		// c.newInstance();

		Class c = loader.loadClass("LocalClass");
		Object o = c.newInstance();
		Method m = c.getMethod("getClass");
		System.out.println(m.invoke(o));
	}
}
 
分享到:
评论

相关推荐

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得...通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为自己的项目开发带来更多的灵活性。

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    《深入理解Java类加载器:基于classloader-playground开源项目》 在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为...

    classloader简单例子

    总的来说,"classloader简单例子"为我们提供了一个学习和实践Java类加载机制的平台。通过这个例子,我们可以学习到如何自定义类加载器,如何处理类的加载过程,以及如何在特定场景下利用类加载器实现更复杂的功能。...

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

    本文将深入探讨Java中的类加载机制,并通过一个具体的自定义类加载器的例子来帮助理解其工作原理。 #### 二、Java类加载器的基本概念 Java中的类加载器主要负责完成以下三个基本任务: 1. **加载(Loading)**:...

    定义ClassLoader调用外部jar包

    在Java编程环境中,ClassLoader是一个至关重要的组件,它负责加载类到Java虚拟机(JVM)中。当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了...

    Java类动态加载(一)——java源文件动态编译为class文件

    Java的类加载是通过ClassLoader实现的,每个类在被使用之前都会由ClassLoader查找并加载。ClassLoader有三个基本职责: 1. 加载:寻找并加载类的字节码。 2. 验证:确保加载的字节码符合Java语法规则和安全约束。 3...

    web_classloader_test.zip_web classloader

    这个例子可能是针对`WebAppClassLoader`的测试。 3. **隔离性**:每个Web应用都有自己的类加载器,这样确保了不同应用间的类是相互独立的,即使它们使用了相同的名字。这就是为什么在同一个服务器上可以部署多个...

    ClassLoader in OSGI

    下面通过一个小例子测试这三个JVM自带的ClassLoader之间的关系: ```java public class ClassLoaderTest1 { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest1.class....

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

    总的来说,防止Java源码被偷窥的关键在于理解并利用Java的ClassLoader机制,结合加密技术,可以在不改变程序功能的前提下增强源码的安全性。通过自定义ClassLoader并实现即时解密,可以有效地保护代码免受反编译器的...

    java 静态代码块通过类加载器获取资源文件例子

    Java支持多种类加载器,包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。当类首次被引用时,对应的类加载器会查找并加载该类的...

    java class reload

    在这个例子中,我们将探讨如何在Tomcat环境下实现Java类的热重载。 1. **Java ClassLoader原理** - Java程序在运行时,类的加载是由ClassLoader负责的。默认情况下,当类被加载后,除非应用停止,否则ClassLoader...

    java dom4j 解析xml的例子,可用

    在Java中,可以通过`File`类的`getAbsolutePath()`方法获取文件的绝对路径,结合`Class.getResource()`或`ClassLoader.getResource()`方法,可以在给定类或类加载器上下文中找到文件的路径。 6. **集成到IDE**:这...

    java 动态代理 简单实例

    Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用方法时添加额外的功能或控制。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等。...

    北大青鸟Java.lang.rar经典例子

    8. **ClassLoader类**:负责加载类到Java虚拟机中。它允许动态加载类,这对于插件系统和动态代码执行非常重要。 在"第六章Java.lang"的压缩包文件中,可能包含了上述各个类的实例代码和练习,帮助学习者通过实际...

    ClassLoader实例

    在这个例子中,`MyClassLoader`继承了`ClassLoader`,并重写了`findClass`方法,从指定的文件路径加载类的字节码。在`main`方法中,我们使用自定义类加载器加载类,并调用其中的方法。 总结来说,理解Java类加载...

    java 类从哪个jar包加载的

    在我们的例子中,标题提到的"java 类从哪个jar包加载的",这通常涉及到类路径(ClassPath)的设置。类路径告诉JVM在哪里查找类文件。你可以通过`-cp`或`-classpath`命令行选项,或者在`JAVA_OPTS`环境变量中指定。...

    java 动态编译.java文件,动态运行类 _1.3

    在这个例子中,我们首先获取系统Java编译器实例,然后创建一个标准文件管理器,用于处理源文件对象。接着,我们将要编译的.java文件转换为`JavaFileObject`,并调用`compiler.compile()`进行编译。 编译完成后,...

Global site tag (gtag.js) - Google Analytics