您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第 07 章 JAVA反射和注释
第七章JAVA反射和注释类的加载、链接、初始化类的加载、连接、初始化JVM和类启动一个JAVA程序时,系统同时会启动一个JAVA虚拟机进程,这个程序中运行的所有线程都会将属于这个进程。同一个JVM里面所有的线程、所有变量都会处于一个进程里面,他们使用该JVM进程的内存区。当JAVA程序运行结束时,JVM进程将会结束,该进程在内存中的状态将会丢失。类的加载、连接、初始化类加载过程:类的加载、链接、初始化类的加载、连接、初始化Java类的加载是由类加载器来完成的。类加载器需要完成的最终功能是定义一个Java类,即把Java字节代码转换成JVM中的java.lang.Class类的对象。类的加载类的加载、连接、初始化分类:启动类加载器(bootstrap)和用户自定义的类加载器(user-defined)区别:启动类加载器是由JVM的原生代码实现的用户自定义的类加载器都继承自Java中的java.lang.ClassLoader类。JVM中最常使用的是系统类加载器(system),它用来启动Java应用程序的加载。通过java.lang.ClassLoader的getSystemClassLoader()方法可以获取到该类加载器对象。类加载器类的加载、连接、初始化类的链接类的链接阶段负责把类的二进制数据合并到JRE中。类链接阶段分为如下三个过程:验证:确保被加载类的正确性。准备:为类的静态变量分配内存,并将其初始化为默认值。解析:把类中的符号引用转换为直接引用。类的加载、连接、初始化类的初始化(1)当一个Java类第一次被真正使用到的时候,JVM会进行该类的初始化操作。(2)初始化过程的主要操作是执行静态代码块和初始化静态域。(3)在一个类被初始化之前,它的直接父类也需要被初始化。但是,一个接口的初始化,不会引起其父接口的初始化。(4)在初始化的时候,会按照源代码中从上到下的顺序依次执行静态代码块和初始化静态域。类的加载、连接、初始化类初始化的时机JAVA中,通过以下6种方式初始化类:(1)创建类的实例,比如用new运算符创建一个类的实例。(2)访问某个类或接口的静态变量,或者对该静态变量赋值(3)调用类的静态方法(4)反射(Class.forName(com.lyj.load))(5)初始化一个类的子类(会首先初始化子类的父类)(6)JVM启动时标明的启动类,即文件名和类名相同的那个类类的加载器类的加载器类加载器(classloader):用来加载Java中的所有类。Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。类的加载器类的加载器(1)BootstrapClassLoader:负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class。(2)ExtensionClassLoader:负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。类的加载器(3)AppClassLoader:负责加载classpath中指定的jar包及目录中class。(4)CustomClassLoader:属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现。类的加载器类加载机制JVM的类加载机制主要有如下几种。(1)全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其它Class也将由该类加载器负责载入。(2)父类委托:先让父类加载器视图加载该Class,如果父类加载器无法加载该类时才尝试从自己的类路径中加载该类。(3)缓存机制:缓存机制会保证所有加载过得Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜索该Class,只有当缓存区不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象存入缓存区中。类的加载器类加载机制类的加载器自定义类加载器JVM中除了根类加载器以外,其它类加载器都是ClassLoader子类的实例可以通过扩展ClassLoader类,并重写ClassLoader中的方法来实现自定义类加载器类的加载器ClassLoader中的关键方法:(1)loadClass(Stringname,booleanresolve):该方法是ClassLoader的入口点,根据指定的二进制名称加载类,系统调用ClassLoader中的该方法来获取指定类对应的Class对象。(2)findClass(Stringname):根据类的全称找类。类的加载器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语言的反射机制:动态获取信息以及动态调用对象方法的功能。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。反射概念反射主要有如下两个重要功能:(1)可以通过反射机制发现对象的类型,发现类的方法/属性/构造器(2)可以创建对象并访问任意对象方法和属性等。反射概念Java中特殊的类方法类(Method类)属性类(Field类)构造器类(Constructor类)类类(Class类)反射概念Class类的实例:表示正在运行的JAVA应用程序的类和接口Method类的实例:执行对应的方法Constructor类的实例:调用对应的构造器创建实例Field类的实例:访问并修改对象的属性值反射概念获得Class实例有如下方式:(1)获得基本类型的Class实例:int.classlong.class(2)获得类类型(Class)实例:Classcls=String.class;Classcls=Class.forName(java.lang.String);Classcls=abc.getClass();反射概念通过Class实例可以获取某个类的属性(Field)、构造器(Constructor)、方法(Method),这3个类都位于java.lang.reflect包下,并实现了java.lang.reflect.Member接口。反射获取对象信息反射获取对象信息通过反射可以获得对象的类、属性、方法、构造器创建对象和访问对象创建对象和访问对象通过反射创建对象(1)通过Class对象的newInstance()方法,这种方法的局限是只能去调用默认的构造方法。(2)通过Class对象的getConstructor()方法获得Construtor对象,然后再通过调用Constructor类的newInstance()方法。创建对象和访问对象通过Class对象的newInstance()方法创建对象时要注意:(1)Class.forName()静态方法,可以利用类名在CLASSPATH中查找对应的类,并且装载到内存,返回这个”class“(2)Class.forName()加载类的过程采用”懒惰方式,即检查发现如果已经加载了(内存中存在)就不再加载,直接返回已经加载的类(3)newInstance()方法,会利用默认(无参数)构造器创建类实例。创建对象和访问对象通过反射访问对象的属性通过反射可以获取出某个对象中有哪些属性,并且可以获取出属性的修饰符,类型,以及属性名,还可以通过反射获取某个属性的值。创建对象和访问对象反射访问对象的方法通过反射可以获取一个类中有哪些方法,并且可以获取方法的访问修饰符、方法的返回类型、方法名字以及方法的参数类型,除此之外还可以通过对象调用某个方法。注解注解注解(Annotation)是JDK1.5的新特性,使用注解是一种趋势注解可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查注解注解格式:‘@注解名’根据注解参数的个数,可以将注解分类为:标记注解单值注解完整注解注解是向编译器或工具软件传达一种信息,相当于是一种标记标记可以加在包,类,字段,方法,方法的参数以及局部变量上注解注解@Override表示当前方法是覆盖父类的方法。@Deprecated表示当前方法是不赞成使用的。@SuppressWarnings表示关闭一些不当的编译器警告信息。java内置了三种最基本的注解,定义在java.lang包中:注解SuppressWarnings注解可以传入的参数:1.deprecation:使用了过时的类或方法时的警告。2.unchecked:执行了未检查的转换时的警告。3.fallthrough:当switch程序块直接通往下一种情况而没有break时的警告。4.Path:在类路径、源文件路径等中有不存在的路径时的警告。5.serial:当在可序列化的类上缺少serialVersionUID定义时的警告。6.finally:任何finally子句不能正常完成时的警告。7.all:关于以上所有情况的警告。注解public@interfaceMyAnnotation{}自定义注解语法格式:JAVA中自定义注解类似定义一个接口的类文件,为了区分和接口的区别,定义注解用@interface注解自定义带成员变量的注解:注解的成员变量定义是在注解中定义无参数方法的形式来定义public@interfaceMyAnnotation{intid();Stringdescription();}注解自定义带成员变量的注解:在定义有成员变量的注解时,也可以为成员变量指定默认值public@interfaceMyAnnotation{intid()default1;Stringdescription()default单元测试;}注解自定义带成员变量的注解:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAnnotation{intid()default1;Stringdescription()default单元测试;}@Retention注解:指定了MyAnnotation注解可以保留到运行时@target注解:指定了@MyAnnotation只能修饰方法注解自定义带成员变量的注解:当在程序中使用注解修饰了类、方法、属性之后,这些注解不会自己生效,必须要提供相应的工具来提取并处理注解信息,在JAVA反射中提供了获取注解信息的类和接口。构造简易Hibernate构造简易Hibernate案例描述JDBC对数据库中的数据进行操作时需要写大量的SQL语句,造成代码非常繁琐,并且不同的数据库之间SQL语句有差异,本案例要求通过XML和反射写一个简单的Hibernate框架,实现最基本的增删查改。构造简易Hibernate案例分析(1)构造的Hibernate框架,需要为用户提供增删查改等方法,并且需要为每个方法设置好需要传入参数的类型。(2)Hibernate要支持任何对象的操作,所以当操作一个对象时需要找出该对象对应的数据库中的哪个表,以及属性和表中字段的对应关系,我们在这里通过xml来配置类和数据库中表的映射关系。构造简易Hibernate(3)如果在xml中配置类和表之间的映射关系,
本文标题:第 07 章 JAVA反射和注释
链接地址:https://www.777doc.com/doc-3870116 .html