初学Java的类加载与反射机制(一),java机制
分享于 点击 40675 次 点评:219
初学Java的类加载与反射机制(一),java机制
一直困惑框架的实现方式,就了解了下Java的类加载和反射机制,把我觉得有用的概念理解下,方便以后回顾。
总结一下类加载机制:
1、classloader是干嘛的?
ClassLoader就是用来加载Java类到Java虚拟机中的,当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里运行,负责加载Java class的这部分就叫classloader。Java应用环境中不同的class文件分别由不同的ClassLoder负责加载。
2、类加载的特性
所有类并非一次加载,需要的时候再加载,static语句块在加载后只执行一次。
在网上找了一个简单的类加载过程,复制一下
Java程序运行的场所是内存,当在命令行下执行: java HelloWorld 命令的时候,JVM会将HelloWorld.class加载到内存中,并形成一个Class的对象HelloWorld.class。 其中的过程就是类加载过程: 1、寻找jre目录,寻找jvm.dll,并初始化JVM; 2、产生一个Bootstrap Loader(启动类加载器); 3、Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。 4、Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。 5、最后由AppClass Loader加载HelloWorld类。 以上就是类加载的最一般的过程。 从上面这个过程可以看出,classloader不止一个,启动类加载器是使用C或者C++编写的,这里不做深究了。但他们并非继承关系,classloader在load class的时候先找上一层的loader,看看上层loader是不是已经load过了,如果已经load了就不会再load了,这样的好处就是安全性好,比如说你自己写了一个String.class,这样的load机制让你自己的String.class永远没机会执行,就避免里面可能存在的破坏性代码。下面我写一段代码,验证下类加载机制的几个特性,注释写的比较清楚,这就不多赘述了
public class People{
public static void main(String[] args) {
//验证类加载机制是否一次性加载所有的类:如果是一次性加载的话,“~~~~”应该在A,B后,如果不是,就应该在A,B中间。
//结果:ClassLoader的类加载机制并非一次性加载所有的类,而是需要的时候再加载,即运行期间动态加载
A a = new A();
System.out.println("~~~~");
B b = new B();
//staic语句块在加载后只执行一次的验证,而构造方法每次new出来都会执行一次
C c = new C();
C c2 = new C();
}
}
class A{
static{
System.out.println("A");
}
}
class B{
static{
System.out.println("B");
}
}
class C{
static{
System.out.println("C");
}
public C(){
System.out.println("C constructor");
}
}
网上有一篇文章对classloader的描述也很不错,分享给大家以方便大家理解
ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。ClassLoader负责载入系统的所有Resources(Class,文件,来自网络的字节流等),通过ClassLoader从而将资源载入JVM
每个class都有一个reference,指向自己的ClassLoader。Class.getClassLoader()
相关文章
- 暂无相关文章
用户点评