自定义类加载器

package com.zkn.newlearn.classloader;

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

/**
 *
 * @author zkn
 *
 */

public class ClassLoaderTest01 extends ClassLoader {

	/**
	 * 路径
	 */
	private String path = "";
	/**
	 * 后缀名
	 */
	private String className = ".class";

	private String name = "";

	private ClassLoader loader = null;

	@Override
	protected Class<?> findClass(String name) {
		byte[] b =loadClassData(name);
		if(b != null && b.length > 0)
			return defineClass(name, b, 0, b.length);
 
		return this.getClass();
	}

	@SuppressWarnings("null")
	private byte[] loadClassData(String names) {
		names = names.replace(".", "\\");
		String clazzName = path + names + className;
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		byte[] bytes = new byte[0];
		int i = 0;
		try{
			is = new FileInputStream(new File(clazzName));
			baos = new ByteArrayOutputStream();
			while(-1!=(i = is.read())){
				baos.write(i);
			}
			bytes = baos.toByteArray();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(is != null)
					is.close();
				if(baos != null)
					baos.close();
			}catch(Exception ee){
				ee.printStackTrace();
			}
		}
		return bytes;
	}

	public ClassLoaderTest01(String name) {
		super();
		this.name = name;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "   "+name;
	}

	public ClassLoaderTest01(String name, ClassLoader loader) {
		super(loader);
		this.name = name;
		this.loader = loader;
	}

	public static void main(String[] args) throws Exception{
		ClassLoaderTest01 loader1 = new ClassLoaderTest01("loader1");
		loader1.setPath("D:\\log4j\\sys\\");

		ClassLoaderTest01 loader2 = new ClassLoaderTest01("loader2",loader1);
		loader2.setPath("D:\\log4j\\common\\");

		ClassLoaderTest01 loader3 = new ClassLoaderTest01("loader3",null);
		loader3.setPath("D:\\log4j\\common\\");

		try{
			test(loader2,"com.zkn.newlearn.classloader.Parent");
		}catch(Exception e){
			loader2 = new ClassLoaderTest01("loader02");
			loader2.setPath("D:\\log4j\\common\\");
			test(loader2,"com.zkn.newlearn.classloader.Parent");
		}

		test(loader3,"com.zkn.newlearn.classloader.Parent");
	}

	private static void test(ClassLoader loader,String name)
			throws ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		Class clazz = null;
		try{
			clazz = loader.loadClass(name);
		}catch(Exception e){
			e.printStackTrace();
		}
		clazz.newInstance();
	}

}
 
package com.zkn.newlearn.classloader;

/**
 *
 * @author zkn
 *
 */

public class Parent {

	public static int i = 1;

	public Parent(){

		new Dog();
		System.out.println("Parent类加载器为:"+Parent.class.getClassLoader());

	}

}
 
package com.zkn.newlearn.classloader;

/**
 *
 * @author pc
 *
 */

public class Dog {

	public Dog(){
		System.out.println("Dog 类 :   类加载器为--"+ Dog.class.getClassLoader());
	}

}
 

ClassLoaderTest01在sys下面:
1、如果Parent类在common下面,由子类加载,即loader2来加载。
<img src="http://img.blog.csdn.net/20160122230640800?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2、如果Parent类在sys下面
由父类加载器加载,即loader1来加载。
<img src="http://img.blog.csdn.net/20160122230703769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
如果Parent在系统目录下
<img src="http://img.blog.csdn.net/20160122230726426?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
对于loader3,无论Parent类在哪目录下,Parent类始终由loader3来加载。
时间: 2024-09-26 02:30:38

自定义类加载器的相关文章

Java类加载器学习2——自定义类加载器和父类委托机制带来的问题

  一.自定义类加载器的一般步骤   Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载器.如果父类加载器加载不了,依次再使用其子类进行加载.当然这类所说的父类加载器,不一定他们之间是继承的关系,有可能仅仅是包装的关系.   Java之所以出现这条机制,因为是处于安全性考虑.害怕用户自己定义class文件然后自己写一个类加载器来加载原本应该是JVM自己加载的类.这样会是JVM虚

java jvm 类加载器-java中为什么要自定义类加载器

问题描述 java中为什么要自定义类加载器 java为什么要自定义类加载器 面试题 希望大神尽快解答 急用 谢谢了! 解决方案 http://www.iteye.com/topic/240013http://blog.sina.com.cn/s/blog_a1ebbd3501019equ.html 解决方案二: 一.类加载器类别? ?* ?1.java虚拟机自带的加载器? ?* ??根类加载器(Bootstrap,c++实现)? ?* ? ?扩展类加载器(Extension,java实现)? ?

JAVA加密解密:自定义类加载器应用

最近在研究JAVA CLASS LOADING技术,已实现了一个自定义的加载器.对目前自定义加载器的应用,还在探讨中.下面是自定义的CLASSLOADER在JAVA加密解密方面的一些研究. JAVA安全 JAVA是解释执行的语言,对于不同的操作平台都有相应的JVM对字节码文件进行解释执行.而这个字节码文件,也就是我们平时所看到的每一个.class文件. 这是我们大家都知道的常识,也就是由.java文件,经过编译器编译,变成JVM所能解释的.class文件. 而这个过程,在现在公开的网络技术中,利

java自定义类加载器

v前言 java反射,最常用的Class.forName()方法.做毕设的时候,接收到代码字符串,通过 JavaCompiler将代码字符串生成A.class文件(存放在classpath下,也就是eclipse项目中的bin目录里),然后通过java反射机制,获取main方法并执行..class文件名称固定.当 A.class文件更新的时候,问题出现了,main方法的执行结果总和第一次的执行结果相同. v程序流程 代码提交->接收代码->编译成A.class文件->java反射->

Java类加载器(二)——自定义类加载器

  用户定制自己的ClassLoader可以实现以下的一些应用: 自定义路径下查找自定义的class类文件,也许我们需要的class文件并不总是在已经设置好的Classpath下面,那么我们必须想办法来找到这个类,在这种清理下我们需要自己实现一个ClassLoader. 确保安全性:Java字节码很容易被反编译,对我们自己的要加载的类做特殊处理,如保证通过网络传输的类的安全性,可以将类经过加密后再传输,在加密到JVM之前需要对类的字节码在解密,这个过程就可以在自定义的ClassLoader中实现

JVM源码分析之自定义类加载器如何拉长YGC

概述 本文重点讲述毕玄大师在其公众号上发的一个GC问题一个jstack/jmap等不能用的case,对于毕大师那篇文章,题目上没有提到GC的那个问题,不过进入到文章里可以看到,既然文章提到了jstack/jmap的问题,这里也简单回答下jstack/jmap无法使用的问题,其实最常见的场景是使用jstack/jmap的用户和目标进程不是同一个用户,哪怕你执行jstack/jmap的动作是root用户也无济于事,不过毕大师这里主要提到的是jmap -heap/histo这两个参数带来的问题,如果使

Java魔法堂:类加载器入了个门

一.前言   <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件--类加载器的相关信息,以便日后查阅.若有纰漏请大家指正,谢谢.   注意:以下内容基于JDK7和HotSpot VM.   二.类加载器种类及其关系 从上图可知Java主要有4种类加载器 1. Bootstrap ClassLoader(引导类加载器):作为JVM的一部分无法在应用程序中直接引用,由C/C++实现(其他JVM可能通过

类加载器

什么是类加载器? 1.稍微了解一下类加载器       类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的.Java Applet 需要从远程下载 Java 类文件到浏览器中并执行.现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用.一般来说,Java 应用的开发人员不需要直接同类加载器进行交互.Java 虚拟机默认的行为就已经足够满足大多数情况的需求了.不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容

Tomcat内核之Tomcat的类加载器

跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制.一般来说,Java Web服务器需要解决以下四个问题: ①   同一个Web服务器里,各个Web项目之间各自使用的Java类库要互相隔离. ②   同一个Web服务器里,各个Web项目之间可以提供共享的Java类库. ③   服务器为了不受Web项目的影响,应该使服务器的类库与应用程序的类库互相独立. ④   对于支持JSP的Web服务器,应该支持热插拔(hotswap)功能. 对于以上几个问