版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章JAVA反射和注释类的加载、链接、初始化
JAVA反射和注释
类的加载、连接、初始化
JVM和类启动一个JAVA程序时,系统同时会启动一个JAVA虚拟机进程,这个程序中运行的所有线程都会将属于这个进程。同一个JVM里面所有的线程、所有变量都会处于一个进程里面,他们使用该JVM进程的内存区。当JAVA程序运行结束时,JVM进程将会结束,该进程在内存中的状态将会丧失。
JAVA反射和注释
类的加载、连接、初始化
类加载过程:类的加载、链接、初始化
JAVA反射和注释
类的加载、连接、初始化
Java类的加载是由类加载器来完成的。类加载器需要完成的最终功能是定义一个Java类,即把Java字节代码转换成JVM中的java.lang.Class类的对象。类的加载
JAVA反射和注释
类的加载、连接、初始化
分类:启动类加载器〔bootstrap〕和用户自定义的类加载器〔user-defined〕区别:启动类加载器是由JVM的原生代码实现的用户自定义的类加载器都继承自Java中的java.lang.ClassLoader类。
JVM中最常使用的是系统类加载器〔system〕,它用来启动Java应用程序的加载。通过的getSystemClassLoader()方法可以获取到该类加载器对象。类加载器
JAVA反射和注释
类的加载、连接、初始化
类的链接类的链接阶段负责把类的二进制数据合并到JRE中。类链接阶段分为如下三个过程:
验证:确保被加载类的正确性。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把类中的符号引用转换为直接引用。
JAVA反射和注释
类的加载、连接、初始化
类的初始化〔1〕当一个Java类第一次被真正使用到的时候,JVM会进行该类的初始化操作。〔2〕初始化过程的主要操作是执行静态代码块和初始化静态域。〔3〕在一个类被初始化之前,它的直接父类也需要被初始化。但是,一个接口的初始化,不会引起其父接口的初始化。〔4〕在初始化的时候,会按照源代码中从上到下的顺序依次执行静态代码块和初始化静态域。
JAVA反射和注释
类的加载、连接、初始化
类初始化的时机JAVA中,通过以下6种方式初始化类:(1)创立类的实例,比方用new运算符创立一个类的实例。(2)访问某个类或接口的静态变量,或者对该静态变量赋值(3)调用类的静态方法(4)反射〔Class.forName("com.lyj.load")〕(5)初始化一个类的子类〔会首先初始化子类的父类〕(6)JVM启动时标明的启动类,即文件名和类名相同的那个类类的加载器
JAVA反射和注释
类的加载器
类加载器〔classloader〕:用来加载Java中的所有类。Java虚拟机使用Java类的方式如下:Java源程序〔.java文件〕在经过Java编译器编译之后就被转换成Java字节代码〔.class文件〕。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。
JAVA反射和注释
类的加载器
JAVA反射和注释
类的加载器
(1)BootstrapClassLoader:负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class。(2)ExtensionClassLoader:负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。
JAVA反射和注释
类的加载器
(3)AppClassLoader:负责加载classpath中指定的jar包及目录中class。(4)CustomClassLoader:属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee标准自行实现。
JAVA反射和注释
类的加载器
类加载机制JVM的类加载机制主要有如下几种。(1)全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其它Class也将由该类加载器负责载入。(2)父类委托:先让父类加载器视图加载该Class,如果父类加载器无法加载该类时才尝试从自己的类路径中加载该类。(3)缓存机制:缓存机制会保证所有加载过得Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜索该Class,只有当缓存区不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象存入缓存区中。
JAVA反射和注释
类的加载器
类加载机制
JAVA反射和注释
类的加载器
自定义类加载器JVM中除了根类加载器以外,其它类加载器都是ClassLoader子类的实例可以通过扩展ClassLoader类,并重写ClassLoader中的方法来实现自定义类加载器
JAVA反射和注释
类的加载器
ClassLoader中的关键方法:(1)loadClass(Stringname,booleanresolve):该方法是ClassLoader的入口点,根据指定的二进制名称加载类,系统调用ClassLoader中的该方法来获取指定类对应的Class对象。(2)findClass〔Stringname〕:根据类的全称找类。
JAVA反射和注释
类的加载器
URLClassLoaderURLClassLoader是ClassLoader的子类;用于从指向JAR文件和目录的URL的搜索路径加载类和资源。Filef=newFile("d:/mysql-connection-1.3.jar");URLurl=f.toURL();
URLClassLoaderclassLoader=newURLClassLoader(newURL[]{url});
ClassxClass=classLoader.loadClass("com.mysql.jdbc.Driver");反射概念
JAVA反射和注释
反射概念
什么是反射java语言的反射机制:动态获取信息以及动态调用对象方法的功能。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
JAVA反射和注释
反射概念
反射主要有如下两个重要功能:(1)可以通过反射机制发现对象的类型,发现类的方法/属性/构造器(2)可以创立对象并访问任意对象方法和属性等。
JAVA反射和注释
反射概念
Java中特殊的类方法类〔Method类〕属性类〔Field类〕
构造器类〔Constructor类〕类类〔Class类〕
JAVA反射和注释
反射概念
Class类的实例:表示正在运行的JAVA应用程序的类和接口Method类的实例:执行对应的方法Constructor类的实例:调用对应的构造器创立实例Field类的实例:访问并修改对象的属性值
JAVA反射和注释
反射概念
获得Class实例有如下方式:(1)获得根本类型的Class实例:int.classlong.class(2)获得类类型〔Class〕实例: Classcls=String.class; Classcls=Class.forName("java.lang.String");Classcls="abc".getClass();
JAVA反射和注释
反射概念
通过Class实例可以获取某个类的属性(Field)、构造器(Constructor)、方法(Method),这3个类都位于java.lang.reflect包下,并实现了java.lang.reflect.Member接口。反射获取对象信息
JAVA反射和注释
反射获取对象信息
通过反射可以获得对象的类、属性、方法、构造器创立对象和访问对象 JAVA反射和注释创立对象和访问对象
通过反射创立对象(1)通过Class对象的newInstance()方法,这种方法的局限是只能去调用默认的构造方法。(2)通过Class对象的getConstructor()方法获得Construtor对象,然后再通过调用Constructor类的newInstance()方法。 JAVA反射和注释创立对象和访问对象
通过Class对象的newInstance()方法创立对象时要注意:(1)Class.forName()静态方法,可以利用类名在CLASSPATH中查找对应的类,并且装载到内存,返回这个〞class“(2)Class.forName()加载类的过程采用〞懒惰方式,即检查发现如果已经加载了〔内存中存在〕就不再加载,直接返回已经加载的类(3)newInstance()方法,会利用默认〔无参数〕构造器创立类实例。 JAVA反射和注释创立对象和访问对象
通过反射访问对象的属性
通过反射可以获取出某个对象中有哪些属性,并且可以获取出属性的修饰符,类型,以及属性名,还可以通过反射获取某个属性的值。
JAVA反射和注释创立对象和访问对象
反射访问对象的方法
通过反射可以获取一个类中有哪些方法,并且可以获取方法的访问修饰符、方法的返回类型、方法名字以及方法的参数类型,除此之外还可以通过对象调用某个方法。注解
JAVA反射和注释
注解
注解〔Annotation〕是JDK1.5的新特性,使用注解是一种趋势注解可以用于创立文档,跟踪代码中的依赖性,甚至执行根本编译时检查
JAVA反射和注释
注解
注解格式:‘@注解名’根据注解参数的个数,可以将注解分类为:标记注解
单值注解
完整注解注解是向编译器或工具软件传达一种信息,相当于是一种标记标记可以加在包,类,字段,方法,方法的参数以及局部变量上
JAVA反射和注释
注解
JAVA反射和注释
注解
@Override表示当前方法是覆盖父类的方法。@Deprecated表示当前方法是不赞成使用的。@SuppressWarnings表示关闭一些不当的编译器警告信息。java内置了三种最根本的注解,定义在java.lang包中:
JAVA反射和注释
注解
SuppressWarnings注解可以传入的参数:
1.deprecation:使用了过时的类或方法时的警告。
2.unchecked:执行了未检查的转换时的警告。
3.fallthrough:当switch程序块直接通往下一种情况而没有break时的警告。
4.Path:在类路径、源文件路径等中有不存在的路径时的警告。
5.serial:当在可序列化的类上缺少serialVersionUID定义时的警告。
6.finally:任何finally子句不能正常完成时的警告。
7.all:关于以上所有情况的警告。
JAVA反射和注释
注解
public@interfaceMyAnnotation{}自定义注解语法格式:JAVA中自定义注解类似定义一个接口的类文件,为了区分和接口的区别,定义注解用@interface
JAVA反射和注释
注解
自定义带成员变量的注解:注解的成员变量定义是在注解中定义无参数方法的形式来定义public@interfaceMyAnnotation{
intid();
Stringdescription();}
JAVA反射和注释
注解
自定义带成员变量的注解:在定义有成员变量的注解时,也可以为成员变量指定默认值public@interfaceMyAnnotation{ intid()default1; Stringdescription()default"单元测试";}
JAVA反射和注释
注解
自定义带成员变量的注解:@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceMyAnnotation{ intid()default1; Stringdescription()default"单元测试";}@Retention注解:指定了MyAnnotation注解可以保存到运行时@target注解:指定了@MyAnnotation只能修饰方法
JAVA反射和注释
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度广告发布合同广告代理及发布协议3篇
- 2024年度版美发店租赁合同模板下载2篇
- 2024版电子产品供应与代理销售合同2篇
- 2024年个人小额借款合同9篇
- 2024年度高校教师人事代理合同2篇
- 净水器品牌2024年度代理经营合同2篇
- 2024年互惠共赢:商务咨询中介合同2篇
- 2024年事业单位医疗卫生人员聘用协议2篇
- 股票合作协议模板三篇
- 教师与学生之间的有效沟通计划
- GB/T 12232-1989通用阀门法兰连接铁制闸阀
- 模仿式二声部课件
- 使用Pandas进行数据分析课件
- 某矿业有限责任公司十三五发展规划课件
- Unit 5 课后阅读课件-人教版高中英语必修第一册
- 有趣的化学启蒙课课件
- 绽放校园文明之花创建文明校园文明礼仪主题班会课件
- 国家开放大学《机械制造基础》形考任务(1-4)试题答案解析
- 2023安规考试题含答案
- 推进“西学中”人才培养实施方案
- 小学科学苏教二年级上册4单元奇妙的光《明亮与黑暗》教学设计定稿(喻晓芳)
评论
0/150
提交评论