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。即前提是类已经编译成class的字节码文件。
如果使用用户自定义的装载器,那么loadClass()方法就要调用
Class<?> | loadClass(String name) |
protected Class<?> | loadClass(String name, boolean resolve) |
这两个方法来装载新的请求的类型,如果找不到,会抛出ClassNotFoundException 异常。
类装载的反向查找是去已经加载的类库中寻找权限定名的过程,如果没有就重新动态扩展,(就像一个map的映射方式去找的。)前提是类已经编译成class的字节码文件。
相关推荐
类加载机制及反射 类加载机制及反射
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
反射机制和类加载机制学习总结 Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并...
java 注解 反射 字节码 类加载 包括pdf资料以及全部源码文件,具有非常大参考价值和学习意义
本学习讲义是关于java类加载和反射机制需要注意的要点学习,内容详细
JAVA反射机制与类的加载,详细的说明java反射机制的实例以及应用是入门级的课件
一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说呢,是因为它在运行时就确定下来了。反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的...
(类的加载概述和加载时机) (类加载器的概述和分类) (获取class文件对象的三种方式) (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并...
里面主要是介绍Java反射的只是,包括介绍Class类的初始化,如何通过反射动态加载类和获取类的信息等。
Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java...
3.2.1 Java反射机制的概念 Java反射机制在Java运行状态中,对于任意一个类,我们都能够知道这个类的所有属性和方法;, 对于任意一个对象,我们都能够调用它的任意一个方法;。 这种动态获取的信息以及动态调用对象...
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:
主要介绍了java 类加载机制和反射详解及实例代码的相关资料,需要的朋友可以参考下
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...
适用于有一定Java编程基础的开发人员,希望了解和应用Java反射机制的使用者。 使用场景及目标 使用反射机制的典型场景包括以下几个方面: 在运行时动态加载和创建类对象。 通过反射调用对象的方法和访问对象的字段...
利用java的反射机制动态加载form,以使得这部分代码能够被重用,是很好的一个重用代码机制的体现
该文件有如何动态加载类,动态获得属性,动态调用方法,动态创建对象等
这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods...
下面小编就为大家带来一篇java 利用java反射机制动态加载类的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
ava语言允许通过程序化的方式间接的对Class操作,Class文件由类加载器加载后,在JVM中将形成一份描述Class的对象,通过该对象可以获知Class的结构信息,如构造函数,属性,方法等。并分别通过Java实例对这些信息进行...