欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java语言中的自定义类加载器实例解析

程序员文章站 2023-01-03 21:10:42
本文研究的主要是java语言中的自定义类加载器实例解析的相关内容,具体如下。 自己写的类加载器 需要注意的是:如果想要对这个实例进行测试的话,首先需要在c盘建立一个...

本文研究的主要是java语言中的自定义类加载器实例解析的相关内容,具体如下。

自己写的类加载器

Java语言中的自定义类加载器实例解析

需要注意的是:如果想要对这个实例进行测试的话,首先需要在c盘建立一个c://myjava的目录。然后将相应的java文件放在这个目录中。并将产生的.clas文件放在c://myjava/com/lg.test目录下,否则是找不到的。这是要注意的。。

class fileclassloader :

package com.lg.test;
import java.io.bytearrayoutputstream;
import java.io.fileinputstream;
import java.io.ioexception;
import java.io.inputstream;
/**
 * created by 鏉庢灉 on 2016/8/6.
 */
public class fileclassloader extends classloader {
	string rootdir=null;
	public fileclassloader(string rootdir) {
		this.rootdir = rootdir;
	}
	@override
	  protected class<?> findclass(string classname) throws classnotfoundexception {
		//首先检查是否已经被加载了。
		class<?> c = findloadedclass(classname);
		string path = rootdir + "/" + classname.replace('.', '/') + ".class";
		if (c != null) {
			return c;
		} else {
			/*双亲委托模式*/
			classloader loaderparent = this.getparent();
			c = loaderparent.loadclass(classname);
			if (c != null) {
				return c;
			} else {
				/*如果再不行的话,就再进行加载。因为字节码的本质就是一个字节数组*/
				inputstream is = null;
				bytearrayoutputstream outputstream = new bytearrayoutputstream();
				try {
					is = new fileinputstream(path);
					byte[] buffer = new byte[1024];
					int len = 0;
					while ((len = is.read(buffer)) != -1) {
						outputstream.write(buffer, 0, len);
					}
					c = defineclass(classname, buffer, 0, buffer.length);
				}
				catch (exception e) {
					e.printstacktrace();
				}
				finally {
					if (is != null) {
						try {
							is.close();
						}
						catch (ioexception e) {
							e.printstacktrace();
						}
					}
				}
			}
			return c;
		}
	}
}

class demo :

package com.lg.test;
/**
 * created by 鏉庢灉 on 2016/8/6.
 */
/*相同的类加载器对同一个类进行加载,得到的hascode是相同的
 * 不同的类加载器对同一类进行加载,得到的hascode是不一样的*/
public class demo {
	public static void main(string[] args) {
		fileclassloader loader = new fileclassloader("c://myjava");
		fileclassloader loader2=new fileclassloader("c://myjava");
		try {
			class<?> c = loader.findclass("com.lg.test.helloworld");
			class<?> c0=loader.findclass("com.lg.test.helloworld");
			class<?> c1=loader2.findclass("com.lg.test.helloworld");
			class<?> c2=loader.findclass("com.lg.test.demo01");
			class<?> c3=loader.findclass("java.lang.string");
			system.out.println(c.hashcode());
			system.out.println(c.getclassloader());
			system.out.println(c0.hashcode());
			system.out.println(c0.getclassloader());
			system.out.println(c1.hashcode());
			system.out.println(c1.getclassloader());
			system.out.println(c2.hashcode());
			system.out.println(c2.getclassloader());
			system.out.println(c3.hashcode());
			system.out.println(c3.getclassloader());
		}
		catch (classnotfoundexception e) {
			e.printstacktrace();
		}
	}
}

最后运行的结果为:

366712642
sun.misc.launcher$appclassloader@4e0e2f2a
366712642
sun.misc.launcher$appclassloader@4e0e2f2a
366712642
sun.misc.launcher$appclassloader@4e0e2f2a
1829164700
sun.misc.launcher$appclassloader@4e0e2f2a
2018699554
null

如果是定义网络类加载器的话,那么就需要使用url来进行了。这是要注意的。

可以将rootdie的值变为com.bjsxt.cn. 然后利用url.openstream()就可以了。

总结

以上就是本文关于java语言中的自定义类加载器实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!