Java反射和注解详解

1.类的加载:

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

---加载

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

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

---连接

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

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

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

---初始化

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

2.反射:

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

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

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

    反射获取构造方法
         Class类中方法
             Constructor<?>[] getConstructors()  返回当前字节码文件对象的所有public修饰的构造方法
             Constructor<T> 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文档声明格式:

<?xml version="1.0" encoding="UTF-8"?>

文档声明必须为<?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底层采用。

 

 

小结:

XML
    可扩展的标记语言

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

        DTD 
            引用DTD
                本地dtd
                <!DOCTYPE beans SYSTEM "bean.dtd">
                公共dtd
                <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
                "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

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


            能根据约束写标签即可

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

            
    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接口允许在运行时通过反射获得注解。

*元注解:

元注解:用于修饰注解的注解。(用于修饰自定义注解的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 修饰字段。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值