|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?为了深切懂得Java的ClassLoader机制,我们先来做以下实行:
packagejava.lang;
publicclassTest{
publicstaticvoidmain(String[]args){
char[]c="1234567890".toCharArray();
Strings=newString(0,10,c);
}
}
String类有一个Package权限的机关函数String(intoffset,intlength,char[]array),依照默许的会见权限,因为Test属于java.lang包,因而实际上应当能够会见String的这个机关函数。编译经由过程!实行时了局以下:
Exceptioninthread"main"java.lang.SecurityException:Prohibitedpackagename:
java.lang
atjava.lang.ClassLoader.defineClass(UnknownSource)
atjava.security.SecureClassLoader.defineClass(UnknownSource)
atjava.net.URLClassLoader.defineClass(UnknownSource)
atjava.net.URLClassLoader.access$100(UnknownSource)
atjava.net.URLClassLoader$1.run(UnknownSource)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(UnknownSource)
atjava.lang.ClassLoader.loadClass(UnknownSource)
atsun.misc.Launcher$AppClassLoader.loadClass(UnknownSource)
atjava.lang.ClassLoader.loadClass(UnknownSource)
atjava.lang.ClassLoader.loadClassInternal(UnknownSource)
奇异吧?要弄清为何会有SecurityException,就必需弄分明ClassLoader的机制。
Java的ClassLoader就是用来静态装载class的,ClassLoader对一个class只会装载一次,JVM利用的ClassLoader一共有4种:
启动类装载器,尺度扩大类装载器,类路径装载器和收集类装载器。
这4种ClassLoader的优先级顺次从高到低,利用所谓的“双亲委派模子”。切实地说,假如一个收集类装载器被哀求装载一个java.lang.Integer,它会起首把哀求发送给上一级的类路径装载器,假如前往已装载,则收集类装载器将不会装载这个java.lang.Integer,假如上一级的类路径装载器前往未装载,它才会装载java.lang.Integer。
相似的,类路径装载器收到哀求后(不管是间接哀求装载仍是下一级的ClassLoader上传的哀求),它也会先把哀求发送到上一级的尺度扩大类装载器,如许一层一层上传,因而启动类装载器优先级最高,假如它依照本人的体例找到了java.lang.Integer,则上面的ClassLoader都不克不及再装载java.lang.Integer,只管你本人写了一个java.lang.Integer,试图代替中心库的java.lang.Integer是不成能的,由于本人写的这个类基本没法被上层的ClassLoader装载。
再说说Package权限。Java言语划定,在统一个包中的class,假如没有润色符,默许为Package权限,包内的class都能够会见。可是这还不敷正确。切实的说,只要由统一个ClassLoader装载的class才具有以上的Package权限。好比启动类装载器装载了java.lang.String,类路径装载器装载了我们本人写的java.lang.Test,它们不克不及相互会见对方具有Package权限的办法。如许就制止了歹意代码会见中心类的Package权限办法。
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。 |
|