初学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()  


发布了25 篇原创文章 · 获赞 6 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览