java类加载机制与反射

1. java 的类装载系统:
在java虚拟机中有两种类装载器: 启动类装载器 和 自定义类装载器。 前者是jvm的一部分,后者是java程序的一部分。不同的类装载器放在不懂得命名空间中。

类转载子系统涉及java的其它几个部分,及来自lang库的类。比如自定义的类装载器必须派生自java.lang.ClassLoader。 ClassLoader中定义的方法为程序提供了访问类装载器机制的接口。

其实在java内置的类装载器有三种。

1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。

2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类

3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器

工作流程装载:查找并装载类型的二进制数据。
链接: 验证 准备 解析
初始化 : 把类变量初始化为正确的初始值。
类的ClassLoader 的 protected final Class findSystemClass(String name);接受一个字符串作为参数,

2. 反射射就是一面镜子   能够在镜子中看到 这个类中的“所有”的东西

有三种可以在程序中得到class对象的方式:

第一中就是 在编译时不知道其类名但在运行期可以得到该类名  使用class类的forname()静态方法获得class对象  如: class c=class.forname("得到的类名的全名  包括属于的工程,包");

第二中就是当我们得到该类的一个对象我们就可以直接用该对象的getclass();方法得到给类的class对象如:
class c=对象名.getclass();

第三种就是我们在运行 前就已经知道其类名的  可以直接使用类名.class来得到一个给类的class对象

如:  class c = 类名.class;

3. 反射装载过程:

除 了系统类,扩展库和classpath的自定义的装载,java还支持动态扩展,包括运行时决定使用的类型,装载,使用它们。通过反射的 java.lang.Class 的forName()方法,或者用户自定义的loadClass()方法,都可以自动扩展java程序。

对于Class。forName() 来讲主要有两种形式:

static Class forName (String  className) Returns the Class object associated with the class or interface with the given string name.

static Class forName (String  name, boolean initialize, ClassLoader  loader) Returns the Class object associated with the class or interface with the given string name, using the given class loader.

三参数的解释 如果initalize设为true,类型会在forName()方法返回前连接并初始化;如果是false,类型会被加载,可能会连接但是不会被明确的初始化。如果loader 为null则使用默认的加载器,也可以选用自定义的加载器。两个forName()方法都返回Class实例的引用,代表被装载的类型。如果不能装载抛出ClassNotFoundException。

如果使用用户自定义的装载器,那么loadClass()方法就要调用

Class loadClass (String  name) Loads the class with the specified  binary name .

protected Class loadClass (String  name, boolean resolve) Loads the class with the specified  binary name .

这两个方法来装载新的请求的类型,如果找不到,会抛出ClassNotFoundException 异常。

类装载的反向查找是去已经加载的类库中寻找权限定名的过程,如果没有就重新动态扩展,(就像一个map的映射方式去找的。)前提是类已经编译成class的字节码文件。

转载于:https://my.oschina.net/u/2600520/blog/602227

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值