[转帖]java的反射和它的类加载机制_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3201 | 回复: 0   主题: [转帖]java的反射和它的类加载机制        下一篇 
smile
注册用户
等级:少校
经验:889
发帖:70
精华:2
注册:2013-4-22
状态:离线
发送短消息息给smile 加好友    发送短消息息给smile 发消息
发表于: IP:您无权察看 2013-4-22 16:52:23 | [全部帖] [楼主帖] 楼主

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的字节码文件。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论