• 注解与反射


    一、注解(annotation)

    1、注解定义

    (1) 注解:也叫元数据,标签,注释,注解是给程序看的,而java注释是给程序员看的;它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

    ②JDK内置四大注解:

    @Override:验证子类是否覆写父类方法成功

    @SuppressWarnings:抑制警告(抑制那条黄色的线)

    @Deprecated  申明 类或者方法。。。已经过期

      @SafeVarargs:抑制警告(java7之后,它专门提供了此注解来抑制使用可变参数和泛型方法带来的警告)

    ③ 自定义注解(需要使用元注解)

      什么叫做元注解: 简单理解,就是贴在注解上的注解

      四大元注解:

       1.  @Target  申明该注解最终能贴的位置

       2.  @Retention  表示注解的生命周期

    RESOURCE注解只存在于源文件时期;

    CLASS注解只存在于源文件和字节码时期

    RUNTIME注解存在于源文件、字节码和运行时期

       3.  @Documented 使用@Documented定义后的注解,在该注解使用后,如果导出API文档,会有该注解的基本信息

       4.  @Inherited   如果该注解是定义在父类上面的,子类也是能被继承到的

    ③、语法格式

    元注解

    public @interface 注解名{

    数据类型 属性名() [default 默认值];      [ ]里面的值是可要可不要的,但 是<>里面的值是必须要的

    }

    注解类型是和类、接口、枚举等一个级别的,要定义一个注解我们需要使

    @interface关键字,同时需要注意定义的注解名前是不需要使

    @符号的,但是在使用的时候,必须是@符号加上注解名。

    使用注解:

    @注解名(属性名=”值”)

    @注解名(属性名={”值1”,”值2”})  //注解类型为数组

    获取属性值的方式:

    注解名.属性名();

    ④注意事项

    如果注解里面属性只有1个,并且属性名叫做value(其他属性名不能省略),

    使用的时候value是可以省略的;如果你的属性名是value,并且它是一个数

    组类型,  使用的时候,只有1个值, {}与value都是可以省略的,如果你

    是多个值,{}一定不能省。

    二、反射(reflect

    1、反射的理解

    使用一种技术在程序运行时就能去操作java对象中的属性、方法、构造方法等(底层的操作)。

    2、学习反射的目标

       1.创建这个类的对象

       2.调用这个类的方法

       3.给这个类的字段设置值,获取字段的值

    3ClassNotFoundException(没有找到字节码文件)异常处理

    出现这个异常的原因及解决办法:

    1.就是你的目标类没有编译成字节码文件---------》1.project--clean                             

       2.修改字节码输出目录

       3.重启eclipse(重新编译字节码文件)

    4、获取字节码对象

    ①获取类的字节码对象:

       1. 类型.class

       2. 对象.getClass();

       3. Class.forName("全限定名")

      全限定名: 包名+类名   

      获取全限定名的快捷的方式:选中类型或者接口名或者注解名(注解也是一种接口),然后右键,选择Copy Qualified Name

    获取接口的字节码对象(接口不能创建对象,注解也是一种接口):

       1.接口.class

      2.Class.forName("全限定名")

    ③获取数组的字节码对象(拿不到全限定名可以理解为全限定名被隐藏了,因此拿不到全限定名):

      1.类型.class

    2.对象.getClass();

    ③获取基本数据类型的字节码对象

    1.类型.class

      2.包装类.TYPE

    ④无返回值类型void  

      1. Void 类是一个不可实例化的占位符类,它持有对表示 Java 关键

      2. 字 void 的 Class 对象的引用。

    5、获取构造方法及创建对象的方法

    Constructor[] getConstructors() 获取类中所有公共的构造方法。(反射里面获取公共的什么指的是权限修饰符)

    Constructor<T> getConstructor(Class<?>... parameterTypes) 获取指定的公共构造方法。

    Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回类中指定的构造方法(所有修饰符的都行)

    Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(所有修饰符的都行)

      Constructor类中有一个创建有参(无参)对象的方法: T newInstance(Object... initargs)

    Class类中有一个创建无参对象的方法:T newInstance()

    虽然说获取了这个构造方法,但是他是私有的,并不能在外面直接使用, 因此我们需要使用忽略他的权限访问修饰符,AccessibleObject 类是Constructor、Field、Method三个类的父类,这个类中提供了一个忽略权限访问修饰符的方法: void setAccessible(boolean flag)

    1、获取方法及调用方法

    Method getMethods() 获取类中所有的的公共方法(包括父类的)

    Method getMethod(String name(方法名), Class<?>... parameterTypes) 获取类中指定的公共方法

    Method getDeclaredMethod() 返回类中所有的方法

    Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回类中指定的方法

      Object invoke(Object obj, Object... args) 第一个参数表示的是要掉用获取的方法的对象,第二个参数表示获取的方法参数

    2、获取所有的字段以及字段的赋值和取值

    Field getField(String name) 返回指定的公共字段。

    Field[] getFields() 返回所有的公共字段

    Field getDeclaredField(String name) 返回指定的字段

    Field[] getDeclaredFields() 获取所有的字段

    void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

    Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。

    获取全限定名

    Class类里面的getName方法返回的是全限定名

    获取类名

    Class类里面的getSimpleName方法返回的是类名

  • 相关阅读:
    hive sql的常用日期处理函数总结
    超详细的六款主流ETL工具介绍及功能对比
    什么是ETL?
    什么是星型模型和雪花型模型,以及区别
    深入解读和应用RFM分析方法(模型)
    分析方法
    Kimball和Inmon方法论的适用场景比较
    数字化转型的本质(10个关键词)
    64个数据分析常用语
    @Transactional
  • 原文地址:https://www.cnblogs.com/limengkun/p/10777125.html
Copyright © 2020-2023  润新知