代码改变世界

GetClassLoader和GetCallerClass的使用

2017-12-26 18:14  faunjoe88  阅读(599)  评论(0编辑  收藏  举报

GetClassLoader是JAVA中用来得到ClassLoader的

JAVA中有以下几种ClassLoader. 

 1.  Bootstrap ClassLoader - GetClassLoader的返回值为Null,是JVM的C++源码, Ext ClassLoader 的Parent

主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作

 2   System ClassLoader -  GetClassLoader返回值为SystemClassLoader.

主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作

 3.  Ext ClassLoader  - 是AppClassLoader 的Parent 返回Ext ClassLoader  

主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。

 4.  App ClassLoader - 返回AppClassLoader

主要负责加载用户类。 

 5.  Customer Class Loader  - 一般都继承App ClassLoader 

用户自定义。

 

GetCallerClass是Sun.Reflector包下Reflection类的方法 

定义为GetCallerClass(int level)

0  -   返回 Reflection类

1  -   返回调用GetCallerClass的类,比如  Class Test{void test(){Class cs = Reflection.GetCallerClass(1)}}, 返回Test.

2  -    返回再上层的类, 如Class Main{new Test().test()}, GetCallerClass(2) 则返回Main. 

3. 4. ....层层上传。

 

两个函数结合可以使用加载安全,如

void security()
{
      Class cs = Reflection.GetCallerClass(2);     
      if(cs.GetClassLoader()!= null)
           throw new SecurityException("Only java core can calll this function")
}
Reflection.getCallerClass() 是取得调用类,这个方法是native的。