---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
类加载器
Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:
Bootstrap,ExtClassLoader,AppClassLoader
类加载器也是Java类,因为其它是Java类的类加载器本身也要被类加载器加载,显然也要被加载器加载,
显然必须有第一个类加载器不是Java类,这正是Bootstrap。
Bootstrap类加载器,它不是一个类,他不需要被别人加载他是嵌套在Java虚拟机的内核中
Java虚拟机中的所有类装载器采用具有父子关系的属性结构进行组织,在实例化每个类装载器对象时,需要为
其制定一个父级类装载器对象或者默认采用系统类装载器为其父类加载
System是由Bootstrap来加载的
有一道面试,能不能自己写个类叫Java.lang.System?
答,通常是不可以的,因为,当我写完java.lang.system之后放在Classpath指定的所有jar或目录下之后,类加载器最后要让Bootstrap 来加载,由于委托机制Bootstrap会在jre/lib/rt.jar找到System.lang.System,但这个并不是我们写的那个,所以,写了也是白写,不会加载我们写的那个
自定义类加载器的编写原理:
ClassLoader 有个方法loadClass(String name)name指定类名就会返回一个Class
模版方法设计模式
父类--〉loadclass/findClass/得到Class文件的内容转换成字节码--〉definClass()
自定义的类加载器必须继承ClassLoader
loadClass方法与findClass方法
defineClass方法
编程步骤:
编写一个对文件内容进行简单加密的程序。
编写了一个自己的类装载器,可实现对加密过的类进行装载和解密
编写一个程序调用类加载器加载类,在源程序中不能用该类名定义引用变量,因为编译器无法识别这个类,程序中可以除了使用ClassLoader。load方法之外,还可以使用设置县城的上下文类
加载器或者系统类加载器,然后再使用Class。forName。
实现步骤:
对不带包名的Class文件进行加密,加密结果存放到另外一个目录,例如:java MyClassLoader MyTest。class F:\itcast
运行加载类的程序,结果能够被正常加载,但打印出来的类装载器名称为AppClassLoader:java MyClassLoader MyTest f:\itcast
用加密后的类文件替换CLASSPATH环境下的类文件,在执行上一步操作就出问题
加密函数:
public static void cypher(InputStream istream,OutputStream ostream) throws Exception{
//下面这段代码可能遇到255的字节,当成byte就成了-1
/*
byte b=0;
while ((b=(byte)istream.read())!=-1) {
ostream.write(b ^ 0xff);
}
*/
int b=-1;
while ((b=istream.read())!=-1) {
ostream.write(((byte)b)^0xff);
}
}
---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------