- 浏览: 21245 次
- 性别:
- 来自: 北京
最新评论
1. 类的加载、连接和初始
a) 类的加载
i. 当程序主动使用某个类的时候,如果该类还未被加载到内存,系统会通过加载、连接、初始化三个步骤来对该类进行初始化。
ii. 类加载指将类的class文件读入内存,并为之建立一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为其创建一个java.lang.Class 对象。
iii. 类的加载是由类加载器完成的,类加载器通常由JVM提供,JVM提供的这些类加载器通常被称为系统类加载器,开发者可以通过继承ClassLoader来创建自己的类加载器。
iv. JVM规范允许预先加载类。
b) 类的连接
i. 当类被加载之后,系统为之生成一个对应的Class对象,接着会进入连接阶段,类连接可分为三个阶段:
ii. 验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致。
iii. 准备:为类的静态属性分配内存,并设置默认初值
iv. 解析:将类的二进制数据中的符号引用替换成直接引用。
c) 类的初始化
i. 在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对静态属性赋值,既可以采用显示字段初始化,也可以在静态初始化块中进行初始化。
ii. 显示字段初始化和静态初始化块都被当成类的初始化语句,JVM会按照这些语句在程序中的排列顺序依次执行。
iii. JVM初始化一个类包含如下几个步骤:
1. 假如这个类还没有被加载和连接,程序先加载并连接该类。
2. 如果该类的直接父类还没有初始化,则先初始化其直接父类。
3. 假如该类有初始化语句,则系统依次执行这些初始化语句。
iv.
d) 类初始化的时机
i. 创建类的实例。包括使用new来创建实例,通过反射来创建实例,通过反序列化来创建实例。
ii. 调用类的静态方法
iii. 访问类或接口的静态属性,或者为静态属性赋值
iv. 通过反射方式来强制创建某个类或接口的java.lang.Class对象,例如Class.forName(“Perosn”)
v. 初始化某个类的子类,当初始化某个类时,该类的所有父类都会被初始化。
vi. 直接使用java.exe去执行某个类。
vii. 对于final型的静态属性,如果该属性在编译时就得到属性值,则可认为该属性可被当成编译时常量。当程序使用编译时常量时,不会执行类的初始化。程序中所有使用编译常量的地方,会在编译时被直接替换成该常量的值。
viii.
2. 类的加载器
a) 类加载器的功能
i. 类加载器负责将class文件(硬盘、网络……)加载到内存,并为之生成对应的java.lang.Class 对象。
ii. 对应JVM的一次运行,一个类只会被加载一次。
iii. 类加载器的分类:
1. Bootstrap ClassLoader: 根类加载器,也被称为引导类加载器,负责加载Java的核心类。
2. Extension ClassLoader: 扩展类加载器,负责加载jre扩展目录(Java_home/jre/lib/ext)中的文件
3. System ClassLoader: 系统类加载器, 负责在JVM启动时,加载来着命令java中的 –classpath 选项 或者 classpath下的jar包和类。
4. 用户类加载器: 开发者可以实现自己的类加载器,通过继承ClassLoader.
b) 类加载器的父子关系
i. 根类加载器 -- > 扩展类加载器 -- > 系统类加载器 -- > 用户类加载器 。
3. 反射
a) 反射的概念
i. 能够分析类能力的程序被称为反射(reflective)
ii. Java的反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
iii. 可以提供如下功能:
1. 在运行时判断任意一个对象所属的类
2. 在运行时构造任意一个类的对象
3. 在运行时判断任意一个类具有的实例变量和方法
4. 在运行时调用任意一个对象的方法
5. 生成动态代理
6. 主要借助于4个类: Class Constructor Field Method
b) 获取Class对象
i. 每个类被加载后,系统都会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类。
ii. 获得Class对象通常有三种方式:
1. 使用Class类的forName()方法,该方法的参数是某个类的全限定名。
2. 调用某个类的class属性来获取该类对应的Class对象。例如String.class
3. 调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。
c) 从Class中获取信息
i. Class类提供了大量的方法来获取该Class对象所对应类的详细信息,主要包含如下几类方法:
ii. 用于访问Class对应的类所包含的构造器的方法。
iii. 用于访问Class对应的类所包含方法的方法。
iv. 用于访问Class对应的类所包含的属性(Field)的方法。
v. 用于访问Class对应的类所继承的父类、所实现的接口的方法。
vi. 用于访问Class对应的类基本信息的方法
vii. 通过Class对象可以得到大量Method、 Constructor、Field等对象,这些对象分别代表该类所包含的方法、构造器和属性等,程序可以通过这些对象来执行实际的功能:例如调用方法、创建实例。
4. 使用反射生成并操作对象
a) 创建对象
i. 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,要求改Class对象的对应类具有默认构造器,newInstance()方法实际上是利用默认构造器来创建该类的实例。
ii. 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例。
b) 调用方法
i. 每个Method对象对应一个方法,获得Method对象后,可通过该对象来调用对应的方法。
ii. Object invoke(Object obj, Object… args)
c) 访问属性
i. 通过Class对象的getFields() 或 getField() 方法可以获取该类所包含全部Field或指定Field。
ii. getXxx(Object obj)
iii. setXxx(Object obj, xxx val)
iv. 通过上述方法可以随意访问指定对象的所有属性,包括private访问控制的属性。
d) 操作数组
i. 在java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组,程序可以通过Array来动态创建数组和操作数组元素。
a) 类的加载
i. 当程序主动使用某个类的时候,如果该类还未被加载到内存,系统会通过加载、连接、初始化三个步骤来对该类进行初始化。
ii. 类加载指将类的class文件读入内存,并为之建立一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为其创建一个java.lang.Class 对象。
iii. 类的加载是由类加载器完成的,类加载器通常由JVM提供,JVM提供的这些类加载器通常被称为系统类加载器,开发者可以通过继承ClassLoader来创建自己的类加载器。
iv. JVM规范允许预先加载类。
b) 类的连接
i. 当类被加载之后,系统为之生成一个对应的Class对象,接着会进入连接阶段,类连接可分为三个阶段:
ii. 验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致。
iii. 准备:为类的静态属性分配内存,并设置默认初值
iv. 解析:将类的二进制数据中的符号引用替换成直接引用。
c) 类的初始化
i. 在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对静态属性赋值,既可以采用显示字段初始化,也可以在静态初始化块中进行初始化。
ii. 显示字段初始化和静态初始化块都被当成类的初始化语句,JVM会按照这些语句在程序中的排列顺序依次执行。
iii. JVM初始化一个类包含如下几个步骤:
1. 假如这个类还没有被加载和连接,程序先加载并连接该类。
2. 如果该类的直接父类还没有初始化,则先初始化其直接父类。
3. 假如该类有初始化语句,则系统依次执行这些初始化语句。
iv.
d) 类初始化的时机
i. 创建类的实例。包括使用new来创建实例,通过反射来创建实例,通过反序列化来创建实例。
ii. 调用类的静态方法
iii. 访问类或接口的静态属性,或者为静态属性赋值
iv. 通过反射方式来强制创建某个类或接口的java.lang.Class对象,例如Class.forName(“Perosn”)
v. 初始化某个类的子类,当初始化某个类时,该类的所有父类都会被初始化。
vi. 直接使用java.exe去执行某个类。
vii. 对于final型的静态属性,如果该属性在编译时就得到属性值,则可认为该属性可被当成编译时常量。当程序使用编译时常量时,不会执行类的初始化。程序中所有使用编译常量的地方,会在编译时被直接替换成该常量的值。
viii.
2. 类的加载器
a) 类加载器的功能
i. 类加载器负责将class文件(硬盘、网络……)加载到内存,并为之生成对应的java.lang.Class 对象。
ii. 对应JVM的一次运行,一个类只会被加载一次。
iii. 类加载器的分类:
1. Bootstrap ClassLoader: 根类加载器,也被称为引导类加载器,负责加载Java的核心类。
2. Extension ClassLoader: 扩展类加载器,负责加载jre扩展目录(Java_home/jre/lib/ext)中的文件
3. System ClassLoader: 系统类加载器, 负责在JVM启动时,加载来着命令java中的 –classpath 选项 或者 classpath下的jar包和类。
4. 用户类加载器: 开发者可以实现自己的类加载器,通过继承ClassLoader.
b) 类加载器的父子关系
i. 根类加载器 -- > 扩展类加载器 -- > 系统类加载器 -- > 用户类加载器 。
3. 反射
a) 反射的概念
i. 能够分析类能力的程序被称为反射(reflective)
ii. Java的反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
iii. 可以提供如下功能:
1. 在运行时判断任意一个对象所属的类
2. 在运行时构造任意一个类的对象
3. 在运行时判断任意一个类具有的实例变量和方法
4. 在运行时调用任意一个对象的方法
5. 生成动态代理
6. 主要借助于4个类: Class Constructor Field Method
b) 获取Class对象
i. 每个类被加载后,系统都会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类。
ii. 获得Class对象通常有三种方式:
1. 使用Class类的forName()方法,该方法的参数是某个类的全限定名。
2. 调用某个类的class属性来获取该类对应的Class对象。例如String.class
3. 调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有Java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。
c) 从Class中获取信息
i. Class类提供了大量的方法来获取该Class对象所对应类的详细信息,主要包含如下几类方法:
ii. 用于访问Class对应的类所包含的构造器的方法。
iii. 用于访问Class对应的类所包含方法的方法。
iv. 用于访问Class对应的类所包含的属性(Field)的方法。
v. 用于访问Class对应的类所继承的父类、所实现的接口的方法。
vi. 用于访问Class对应的类基本信息的方法
vii. 通过Class对象可以得到大量Method、 Constructor、Field等对象,这些对象分别代表该类所包含的方法、构造器和属性等,程序可以通过这些对象来执行实际的功能:例如调用方法、创建实例。
4. 使用反射生成并操作对象
a) 创建对象
i. 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,要求改Class对象的对应类具有默认构造器,newInstance()方法实际上是利用默认构造器来创建该类的实例。
ii. 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例。
b) 调用方法
i. 每个Method对象对应一个方法,获得Method对象后,可通过该对象来调用对应的方法。
ii. Object invoke(Object obj, Object… args)
c) 访问属性
i. 通过Class对象的getFields() 或 getField() 方法可以获取该类所包含全部Field或指定Field。
ii. getXxx(Object obj)
iii. setXxx(Object obj, xxx val)
iv. 通过上述方法可以随意访问指定对象的所有属性,包括private访问控制的属性。
d) 操作数组
i. 在java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组,程序可以通过Array来动态创建数组和操作数组元素。
发表评论
-
遮盖层覆盖整个页面
2015-07-08 10:45 553html代码: <body topmargin= ... -
spring注解+restlet
2014-08-26 13:32 605spring注解精解: http://www.douban.c ... -
Spring使用程序方式读取properties文件
2014-07-03 10:37 487Spring使用程序方式读取properties文件 在sp ... -
用javascript取当前系统时间(年、月、日等全)
2013-07-25 14:56 527var myDate = new Date(); myDate ... -
sql--查询数据库的连接数
2013-06-07 14:04 552Oracle: select * from v$sessio ... -
jQuery中设置form表单中action值的方法
2013-04-28 18:16 1083html代码: <form id="myFo ... -
java filter
2013-04-24 23:17 831一、使浏览器不缓存页面的过滤器 Java代码 impo ... -
sql count
2013-04-23 14:33 668连接该服务器的个数: SELECT count(*) FRO ... -
关闭打开页js(兼容浏览器)
2013-04-22 13:17 810<script> function closeSe ... -
sql-修改表
2013-04-11 10:19 646如需在表中添加列,请使用下列语法: ALTER TABLE t ... -
wget 爬虫
2012-11-13 13:34 1416wget 使用指南 wget是一个从网络上自动下载文件的自由工 ... -
Struts2的整理
2012-11-13 13:31 8191、任何表现层框架都是用来帮我们实现MVC model1(js ... -
dwr的使用
2012-11-11 12:38 744Dwr使用说明 1. 将dwr的ja ... -
Ajax的使用
2012-11-11 12:37 662ajax的使用步骤: 1.需要通过JavaScript创建XM ... -
JAVA数据库连接池
2012-11-09 00:02 693JAVA数据库连接池 基 ... -
事务传播特性和事务隔离级别
2012-11-08 23:48 562事务传播特性了解事务 ... -
ibatis
2012-11-08 23:45 712ibatis: ibatis中dao中的方法在使用sqlMap ... -
懒加载
2012-11-07 19:03 595get和load默认的时候都是立即检索,只有设置lazyloa ... -
HQL语句
2012-11-07 19:01 5791.实体查询 String hql = &qu ... -
部分重要SQL语句
2012-11-06 20:13 690TO_CHAR(date, 'fmt') 用于将 ...
相关推荐
本学习讲义是关于java类加载和反射机制需要注意的要点学习,内容详细
类加载机制及反射 类加载机制及反射
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
33_反射(类加载、反射)_讲义
Java反射动态加载实例类,动态加载实例类,帮助理解反射
【反射-类加载之间的关联关系】 1、 使用反射方法强制创建某各类或者接口对应的java.lang.Class对象时,会进行类加载,(而类加载会将字节码的class文件读入...2、 反射让类加载了,当然接着可以调用类的属性和方法。
反射,动态加载指定类调用类中的方法 简单例子
C# 程序集 类型加载 反射 C# 程序集 类型加载 反射 QQ:292258449
day17-类加载器和反射
java 类加密 使用类加载器解密加载类 反射执行main
IO(输入/输出)是所有程序都必需的部分:使用输入机制,允许程序读取外部数据(包括来自磁盘、光盘等存储设备的数据)、用户输入数据;使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘、光盘等存储设备...
类加载器与反射.pptx
反射机制和类加载机制学习总结 Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并...
day15-类加载器&反射
java 注解 反射 字节码 类加载 包括pdf资料以及全部源码文件,具有非常大参考价值和学习意义
java 类加载 。。。反射
利用反射实现类的动态加载
1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile(程序集路径,不能是相对路径); // 加载程序集(EXE 或 DLL) dynamic obj = assembly....
讲的是加载动态菜单,然后利用反射Show出窗口
学生提问:非静态内部类对象和外部类对象的关系是怎样的? 206 6.7.2 静态内部类 207 学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 ...