`
benx
  • 浏览: 273102 次
  • 性别: 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类加载器的小例子程序,大家可以参看我的博文

    corejava基础重要知识点总结

    = 秘书 = 类加载器 = ClassLoader = 保镖 = 字节码校验器 = ByteCode Verifier = 翻译 = 解释执行器 = Interfreter 2:安全 健壮 电力 电信 银行 都会有限考虑使用java实现 3:免费 开源 4:简单 语法简单...

    高级java笔试题-itresource:程序开发技术资源集合

    ClassLoader 基本原理 ] () [ 解决eclipse显示jar源代码中文乱码问题 ] () [ 使用 RMI + ZooKeeper 实现远程调用框架 ] () [ Java 注解指导手册 – 终极向导 ] () [ 轻量级分布式 RPC 框架 ] () [ 一个简单的guava ...

    Java-Runtime-Compiler:Java运行时编译器

    Java运行时编译器 这将获取一个String,对其进行编译并加载它,从而从您所构建的内容中返回一个类。 默认情况下,它使用当前的ClassLoader。 它支持嵌套类,否则一次构建一个类。在Maven Central 您可以在项目中加入...

    Java编程经验

    不过至少笔者今日才弄懂JVM去查询类的原理,编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader. 这3个加载器分别对应着...

    jvm-core-learning-example:关于Java虚拟机核心知识点学习积累的例子,是初学者及虚拟机核心知识巩固的最佳实践

    -jvm-core-learning-example关于Java虚拟机核心知识点学习积累的例子,是初学者及虚拟机核心知识巩固的最佳实践。作者与学习乐园原始码地址:我的作者:项目结构src目录Java虚拟机核心知识点学习代码并测试案例test...

    java高级技术

    里面介绍了一些有关java的高级技术,例如发射 内部类 类加载器的例子

    深入JVM内核 - 原理、诊断与优化

    热替换例子 详细介绍ClassLoader的原理和应用。分析2个案例,说明ClassLoader的使用。 第七课 性能监控工具 线程死锁分析 OOM分析 介绍常用的JVM诊断和分析工具,并以死锁和OOM为例,展示这些工具的使用。 第八课...

    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 父子容器 ...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...

Global site tag (gtag.js) - Google Analytics