自定义类加载器

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来加载。

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

SAX简单解析XML - 2016-05-30 14:05:35

package com.zkn.xmlparse.text;import java.io.File;import java.util.Iterator;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * pTitle: /p * * pDescription: /p * * @since:2015-6-3 下午12:40:10 *
package com.zkn.reflect.classinfo;import java.lang.reflect.Field;import java.lang.reflect.Type;import com.zkn.reflect.scope.Company;import com.zkn.reflect.scope.People;/** * pTitle: /p * * pDescription: /p * * * @since:2015-5-25 下午07:02:09 * */public clas

枚举算法 - 2016-05-30 14:05:06

枚举(穷举)法   枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件: (1):可预先确定候选答案的数量; (2):候选答案的范围在求解之前必须有一个确定的集合.   实例1:填数游戏.    Java代码描述: public static void main(String[] args) {int multi = 1;int result = 0;int i1, i2, i3, i4, i5;for (i1 = 1; i1 = 9; i1++) { for (i2 = 0; i

Java中的网络编程 - 2016-05-29 17:05:27

一、网络通讯方式   在现有的网络中,网络通讯的方式主要有两种:     1.TCP(传输控制协议)方式     2.UDP(用户数据报协议)方式        为了方便理解这两种方式,还是先来看一个例子。大家使用手机时,向别人传递信息时有两种方式:拨打电话和发送短信。使用拨打电话的方式可以保证将信息传递给别人,因为别人接听电话时本身就确认接收到了该信息。而发送短信的方式价格低廉,使用方便,但是接收人有可能接收不到。 在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟
Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

java和 javaw 以及 javaws的区别 - 2016-05-29 17:05:42

java、javaw和javaws的区别: 首先,所有的这些都是java的启动装置,java.exe经常使用,当使用命令行输出到window的时候,会有java.exe进程,通过任务管理器可以看到。通常 我们执行一些小的java程序的时候会有 java.exe进程在运行。javaw.exe对于我们也比较特殊,我们也能够通过任务管理器看到javaw.exe进程的运行。javaws通常web开启的时候的进程。   jvm.dll jvm.dll是一个java虚拟机在windows平台环境上的实现,也是JRE的

那一年你定义了一个接口 - 2016-05-29 14:05:46

那一年,你定义了一个接口: public interface WtfService { public void process(WtfDto dto); } 为了良好的扩展性,你定义了一个扩展字段,MapString, String类型,并且在文档里强调了“key和value都是String类型”: public class WtfDto implements Serializable { //other fields private MapString, String extInfo; public Ma

自定义Tag标签 - 2016-05-28 14:05:12

今天学习了一下如何自定义一个Tag标签,下面将几个要点列举一下: 1、创建标签类 1)需集成: javax.servlet.jsp.tagext.TagSupport; 2)重写doStartTag()方法,TagSupport中定义的pageContext可直接使用 3)使用JspWriter输出数据:JspWriter out = this.pageContext.getOut(); 2、创建tld文件 1)创建目录/WebRoot/WEB-INF 2)tld主体文件: uri/zl/uritagnam
1、String 、StringBuffer、StringBuilder的执行效率       StringBuilder StringBuffer String   当然这个是相对的,不一定在所有情况下都是这样 如: String a = 'a' + ‘b’ + 'c' 的效率比 StringBuffer buffer = new StringBuffer().append(‘a‘).append(’b‘).append(’c‘)要高 因此这三个类各有利弊,要根据自己的需要来决定用哪个 当字符串较少或者
  学习一门新语言,最好最快的方法就是与现在所掌握的语言对比着思考。   公司最近有个新项目,要用Nodejs开发,现在Nodejs已经很成熟了,可以试试。又开始重新研究,考虑了一下,可以写一系列PK文章,可以帮助刚刚接触Nodejs的朋友,轻松入门。   做了很多年Java开发的,就用Nodejs与Java做对比,来个PK。写此文章不为分出谁胜谁负,只是为了学习。两种语言,各有特色,各有特点。   环境搭建:Nodejs 胜 Java   Nodejs下载一个官方的安装包,一步一步安装就可以了,命令行就