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语言的反射机制。...
适用于有一定Java编程基础的开发人员,希望了解和应用Java反射机制的使用者。 使用场景及目标 使用反射机制的典型场景包括以下几个方面: 在运行时动态加载和创建类对象。 通过反射调用对象的方法和访问对象的字段...
利用java的反射机制动态加载form,以使得这部分代码能够被重用,是很好的一个重用代码机制的体现
Java 反射机制是 Java 语言中的一种强大功能,允许程序在运行时访问和修改类的信息。然而,这种功能也引入了安全隐患。本文将讨论 Java 反射机制的安全问题,重点介绍反射机制的基本概念、反射机制的安全隐患和防御...
该文件有如何动态加载类,动态获得属性,动态调用方法,动态创建对象等