JDK中的classloader基础与反射

一、JAVA程序运行的过程

Java程序运行过程,首先假设我们有一个xxx.Class文件,

那个这个class文件首先会被classloader将其load到内存中的codeSegment区域中,

那么站在classloader的角度来看的话,那个这里面的一个个的class就是一个对象,

这个对象是什么对象呢,就是xxx.class 实际上就是那个class的对象

然后loader的class找到main开始执行,运行过程中会有好多其他的class被load到内存,因为动态加载机制

class并不是一次性全部加载,而是运行到了才去加载,配置java运行在VM  argus中设置-veverbose:class可以看到类的具体加载过程;static语句块在加载后只执行一次,相反的其他,每次new的是时候都会加载

二、JDK中内置了很多个ClassLoader,

其中核心的是bootstrap class loader,

还有extension class loader 它负责loader the class from jre/lib/ext 文件下在jar,他负责jdk的扩展类 

application  class loader 他负责loader用户定义的class,这个loader可以通过ClassLoader.getSystemClassLoader()获得

还有一个其他的classloader可以通过classloader的集成去查找

其大概的顺序是bootstrap loader 加载  extension loader 加载 application loader  加载其他 loader

//测试上述的执行顺序

//可以理解成是哪个classloader加载的这个class

    ClassLoader c = TestClassLoader.class.getClassLoader();
	  while(c != null){
	   System.out.println(c.getClass().getName());
	   //getParent是这个对象有一个引用指向的extesionClassloader的对象,并不是继承
	   c = c.getParent();
	  }

二、反射测试程序

package com.ws.classloader;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestReflection {
	public static void main(String[] args) {

		try {
			// 首先加载T到内存 注意使用forname的时候其中的参数(class)必须指定到包名,

			// java.lang.ClassNotFoundException Class.forName()不然那报错
			String str = "com.ws.classloader.T";
			Class c = Class.forName(str);
			// 然后创建T的实例
			Object TnewInstance = c.newInstance();
			Method[] methods = c.getMethods();

			for (Method m : methods) {
				if (m.getName().equals("m2")) {
					m.invoke(TnewInstance);
				}
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

	}

}

 

package com.ws.classloader;

class T {
	public String a;
	public int b;

	// 静态代码去loader值加载一次
	static {
		System.out.println("T Loader 动态代码块加载..");
	}

	public T() {
		System.out.println("T constructed  无参数构造方法加载~!");
	}

	public void m2() {
		System.out.println("m2 invoked   自定义方法m2加载");
	}

	public void m1(String a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值