Java反射和注解详解

1.类的加载:

1)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

---加载

就是指将class文件读入内存,并为之创建一个Class对象。

任何类被使用时系统都会建立一个Class对象

---连接

验证:是否有正确的内部结构,并和其他类协调一致. 确保Class文件中包含的信息符合当前虚拟机的要求.比如,校验某非抽象类是否实现了抽象父类的全部方法.方法体中 类型转换 符号是否有效等.

准备:负责为类的静态成员分配内存,并设置默认初始化值

解析:将类的二进制数据中的符号引用替换为直接引用

---初始化

对类的静态内容执行初始化操作

Java反射和注解详解_第1张图片

2.反射:

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

简而言之,反射就是:在运行时通过代码操作Class

Java反射和注解详解_第2张图片

反射
    通过反射可以获取到一个类的构造方法,成员方法成员变量 并运行
    反射将一个类的各个部分映射成相应的类

    反射获取构造方法
         Class类中方法
             Constructor[] getConstructors()  返回当前字节码文件对象的所有public修饰的构造方法
             Constructor getConstructor(Class... parameterTypes) 返回指定了参数的构造方法 
            参数
                Constructor 用来描述构造方法的类  返回回来的就是Constructor的对象
 *                 Class... parameterTypes 可变参数  是构造方法参数类型 如果参数不写 则返回空参构造方法
        Constructor
             T newInstance(Object... initargs)  运行构造方法创建对象 
                                返回值T 是泛型 没有泛型就是Object类型
                                参数 为构造方法要使用的实际参数  参数不写则运行的是空参构造方法
        
        1.获取字节码文件对象
        2.通过字节码文件对象获取构造方法对象
        3.通过构造方法对象调用方法运行构造方法

    反射获取对象的快捷方式
        Class类的方法
             T newInstance()  创建此 Class 对象所表示的类的一个新实例。
             前提 必须有空参构造  空参构造必须public修饰
        1.获取字节码文件对象
        2.通过字节码文件直接调用newInstance创建对象

    反射获取成员变量(因为成员变量都是私有的,所以用的很少)(了解)
        Class类中方法
             Field getField(String name)   返回指定变量名的成员变量
             Field[] getFields()  返回所有public修饰的成员变量
        Field类中的方法
             void set(Object obj, Object value) 为指定对象的成员变量赋值  obj为要赋值的对象 value为要赋的值
        1.获取字节码文件对象
        2.通过字节码文件对象获取字段对象
        3.调用set方法为字段赋值 注意 需要给定一个对象 可以通过快捷方式反射创建

    反射获取成员方法
        Class类中方法
             Method[] getMethods()  获取所有公共方法
             Method getMethod(String name, Class... parameterTypes)  获取指定方法名的公共方法
                                            name 方法名
                                            Class... parameterTypes 可变参 方法需要的参数类型 如果不写为空参方法
        Method类中方法    
             Object invoke(Object obj, Object... args)   对带有指定参数的指定对象调用由此 Method 所表示的方法
                                     obj 要运行哪个对象的方法
                                     args 方法的实际参数
        1.获取字节码文件对象
        2.通过字节码文件对象获取方法对象
        3.调用invoke方法运行当前方法 注意 需要给定一个对象 可以通过快捷方式反射创建

 

3.注解和xml:

xml:

1)xml:XML全称为Extensible Markup Language,意思是可扩展的标记语言。XML 被设计用来传输和存储数据。

2)XML文档声明格式:

文档声明必须为结束;

文档声明必须从文档的0行0列位置开始;

文档声明只有2个属性:

version:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;

encoding:指定当前文档的编码。可选属性,默认值是utf-8;

3)xml约束:

在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

常见的xml约束:DTD、Schema

目的: 通过约束文档,可以编写出符合约束格式的XML文档.

4.xml解析:

1)发中比较常见的解析方式有三种,如下:

  1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
    1. 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
    2. 缺点:XML文档过大,可能出现内存溢出显现。
  2. SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
    1. 优点:处理速度快,可以处理大文件
    2. 缺点:只能读,逐行后将释放资源。
    3. PULL:Android内置的XML解析方式,类似SAX。
    4. 常见的解析开发包:
      1. JAXP:sun公司提供支持DOM和SAX开发包
      2. JDom:dom4j兄弟
      3. jsoup:一种处理HTML特定解析开发包
      4. dom4j:比较常用的解析开发包,hibernate底层采用。

 

 

小结:

Java反射和注解详解_第3张图片

XML
    可扩展的标记语言

    作用
        1.存放数据
        2.配置文件
    语法
        文档声明
            
            1.文档声明必须为结束;
            2.文档声明必须从文档的0行0列位置开始;
            3.文档声明只有2个属性:
                version 版本
                encoding 编码
        元素
            
            1.必须开始结束
            2.标签由开始标签,元素体、结束标签组成大家好
            3.元素体 可以是文本 也可以是标签你好
            4.空元素
            5.元素命名 区分大小写 不用特殊符号 不要xml开头
            6.必须有根元素
        属性
            
            1.出现在开始标签
            2.属性名="属性值"
            3.一个元素多个属性不可相同
            4.属性名无特殊符号 字母开头
        注释
            
        转义字符(不用记)
            <  <
            >  >
            "  "
            '  '
            &  &
        CDATA
                             纯文本
            ]]>

        DTD 
            引用DTD
                本地dtd
                
                公共dtd
                                 "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

            元素声明(了解)
                ? 0-1次
                *  任意次
                +  至少1次
                () 分组
                |  或
                ,  顺序
            属性声明(了解)
                属性的语法:(attribute)
                                     属性名 属性类型 约束
                    属性名 属性类型 约束
                    ...
                >
                元素名:属性必须是给元素添加,所有必须先确定元素名
                属性名:自定义
                属性类型:ID、CDATA、枚举…
                    ID : ID类型的属性用来标识元素的唯一性
                    CDATA:文本类型
    
                约束:
                    #REQUIRED:说明属性是必须的;required
                    #IMPLIED:说明属性是可选的;implied


            能根据约束写标签即可

        Schema 
            引用Schema
                                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xsi:schemaLocation="http://www.baidu.com/bean bean-schema.xsd"
                >
            能根据约束写标签即可
            

            
    xml解析
        DOM解析原理
            将xml加载进内存 形成DOM树 并得到一个document对象
        dom4j
            常用API如下:
            1.SaxReader对象
                a)read(…) 加载执行xml文档
            2.Document对象
                a)getRootElement() 获得根元素
            3.Element对象
                a)elements(…) 获得指定名称的所有子元素。可以不指定名称
                b)element(…) 获得指定名称第一个子元素。可以不指定名称
                c)getName() 获得当前元素的元素名
                d)attributeValue(…) 获得指定属性名的属性值
                e)elementText(…) 获得指定名称子元素的文本值
                f)getText() 获得当前元素的文本内容

 

---注解---

1)什么是注解:Annotation注解,是一种代码级别的说明。一个特性,与类、接口、枚举是在同一个层次。

2)注解的作用:

*编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。

*代码分析:通过代码里标识注解,对代码进行分析,从而达到取代xml目的。

*编写文档:通过代码里标识注解,辅助生成帮助文档对应的内容

 

3)自定义注解:

*定义类: class   定义接口:interface  定义枚举:enum

*自定义注解语法:

定义注解使用关键字: @interface

// #定义注解

@interface MyAnno1{

}

//#2 定义含有属性的注解

@interface MyAnno2{

public String username() default "jack";

}

 

*属性格式:修饰符  返回值类型   属性名()  [default 默认值]

*使用格式:@注解类名( 属性名= 值 , 属性名 = 值 , .....)@MyAnno_2(username="rose")

*自定义注解解析:

JDK提供java.lang.reflect.AnnotatedElement接口允许在运行时通过反射获得注解。

Java反射和注解详解_第4张图片

Java反射和注解详解_第5张图片

*元注解:

元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)

JDK提供4种元注解:

@Retention 用于确定被修饰的自定义注解生命周期。

  1. RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。用途:提供给编译器使用。
  2. RetentionPolicy.CLASS 被修饰的注解只能存在源码和字节码中,运行时内存中没有。用途:JVM java虚拟机使用
  3. RetentionPolicy.RUNTIME 被修饰的注解存在源码、字节码、内存(运行时)。用途:取代xml配置

 

@Target 用于确定自定义注解被使用的位置。

   -1.ElementType.TYPE 修饰类、接口。

   -2.ElementType.CONSTRUCTOR 修饰构造。

   -3.ElementType.METHOD 修饰方法。

   -4.ElementType.FILED 修饰字段。

Java反射和注解详解_第6张图片

你可能感兴趣的:(#,Java)