反射注解详细介绍

  • 反射
    • 概念:反射是一种机制,利用该机制可以在程序运行过程中对类进行解饱并操作类的方法,属性,构造方法等成员。
    • 使用反射机制解刨类的前提:必须获取到该类的字节码文件对象,即Class类型对象。
      • 反射使用的统一步骤:
        • 1.获取Class对象
        • 2.要操作谁,就找到谁
          • 1.操作构造方法:要获取Constructor对象,getConstructor() getDeclaredConstructor()
          • 2.普通操作方法:要获取Method对象:getMethod,getDeclaredMethod()
          • 3.操作属性字段:要获取Field对象:getField(),getDeclaredField()
        • 3.如果操作的是private,需要提前设置需要暴力反射:setAccessible(true)
        • 4.反射操作:
          • 1.操作构造方法:newInstance()
          • 2.操作普通方法:invoke()
          • 3.操作属性字段:get(),set()
      • 获取Class对象的Method信息(成员方法)
        • 概述:Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以 调用方法。
        • 特点:比普通方式麻烦,比普通方式强大。
        • Class类中与Method相关方法
          •  Method getMethod("方法名", 方法的参数类型... 类型)  根据方法名和参数类型获得一个方法对象,只能是获取public修饰
          •  Method getDeclaredMethod("方法名", 方法的参数类型... 类型)    根据方法名和参数类型获得一个方法对象,包括private修饰的 
          • Method[] getMethods()    获取所有的public修饰的成员方法,包括父类中。 
          •  Method[] getDeclaredMethods()    获取当前类中所有的方法,包含私有的,不包括父类中。 
      • Constructor类中常用的方法
        • 1. T newInstance(Object... initargs)     根据指定参数创建对象。 
        • 2. void setAccessible(true)    暴力反射,设置为可以直接访问私有类型的构造方法。 
      • 获取Class对象的Constructor信息
        • Constructor类概述:Constructor是构造方法类,类中的每一个构造方法都是Constructor的对象,通过 Constructor对象可以实例化对象。
      • 1.获取Class对象的三种方式:得到Class对象的三种方式.
        • 方式1:通过类名.class获取 Class clazz=类名.class;
        • 方式2:通过Object类的成员方法getClass()方法获取 Class clazz=对象.getClass()
        • 方式3:通过Class.forName("权限定类名")方法获取 Class.clazz=Class.forName("java.lang.String");
      • 常用方法:
        • clazz.getName():获取全限定类名.
        • clazz.getSimpleName():获取简单类名(不包含包名)
        • clazz.newInstance():生成类的实例对象。
    • 2.得到并操作Constructor(反射) 生成一个类的实例对象,不是通过普通的new方式,而是通过反射。
      • 获取Constructor
        • clazz.getConstructor(Class... argTypes):获取的是public类型的构造方法
        • clazz.getDeclaredConstructor(Class... argTypes):获取的是任意类型的构造方法
        • clazz.getConstructors():获取所有public类型的构造方法Constructor数组
        • clazz.getDeclaredConstructors():获取所有任意类型的构造方法Constructor数组
      • 反射调用Constructor
        • constructor.newInstance(Object... argValues):生成类的实例对象
          • 参数argValues:构造方法的实参值
        • constructor.setAccessible(true):设置Constructor允许暴力反射
          • 如果是要操作private类型的Constructor,就需要提前设置允许暴力反射
    • 3.得到并操作Method(反射)
      • 获取到Method
        • clazz.getMethod(String methodName, Class... argTypes):获取public类型的方法
        • clazz.getDeclaredMethod(String methodName, Class... argTypes):获取任意类型的方法
        • clazz.getMethods():获取所有public类型的方法Method数组(自己的和父类的)
        • clazz.getDeclaredMethods():获取所有任意类型的方法Method数组(自己的)
      • 反射调用Method
        • method.invoke(Object target, Object... argValues):反射调用方法
          • 参数:
            • target:调用哪个对象的方法
            • argValues:方法的实参
          • 返回值:方法的返回值
        • method.setAccessible(true):设置方法允许暴力反射
    • 4.得到并操作Field(反射)
      • 获取到Field对象
        • clazz.getDeclaredField(String fieldName):获取指定名称的属性(任意类型)
        • clazz.getField(String fieldName):获取指定名称的属性(public类型)
        • clazz.getDeclaredFields():获取所有任意类型的属性,得到Field数组
        • clazz.getFields():获取所有public类型的属性,得到Field数组
      • 反射操作Field对象
        • field.set(Object target, Object value):设置属性值
          • target:设置哪个对象的属性值
          • value:设置的值
        • field.get(Object target):获取属性值
        • field.setAccessible(true):设置允许暴力反射
        • field.getType():获取属性类型
  • BeanUtils工具包
    • 概述:BeanUtils是Apache commons组件的成员之一,主要用于简化JavaBean封装数据 的操作。常用的操作有以下三个:
      • 对JavaBean的属性进行赋值和取值。
      • 将一个JavaBean所有属性赋值给另一个JavaBean对象中。
      • 将一个Map集合的数据封装到一个JavaBean对象中。
    • 使用BeanUtils
      • BeanUtils.setProperty(Object bean, String fieldName, Object fieldValue):设置属性值
      • BeanUtils.getProperty(Object bean, String fieldName):获取属性值
      • BeanUtils.populate(Object bean, Map<String,Object> map):把map里的数据封装到JavaBean对象里
  • JavaBean概述
    • 1.JavaBean就是一个类,但该类需要满足以下三个条件: 
      • 类必须使用public修饰。
      • 提供无参数的构造器。
      • 提供getter和setter方法访问属性
    • 2.JavaBean的两个重要概念:
      • 字段:就是成员变量,字段名就是成员变量名。
      • 属性:属性名通过setter/getter方法去掉set/get前缀,首字母小写获得。
      • 注意:创建JavaBean的时候,要保证字段名和属性一致。使用idea快捷键生成,而不要自己手写
  • 注解
    • 什么是注解
      • 注解:Annotation,是和class、inteface同一等级的代码说明。是一种记号,记号本身没有功能,是其它软件、其它代码增加的功能。
      • 注解的作用和JDK中常用的注解:
        • @Override:被@Override标记的方法,idea/eclipse会提供功能:检查语法
        • @Deprecated:被@Deprecated标记的方法,idea/eclipse会提供功能:把使用方法的代码划掉
        • @SupressWarning:压制警告,idea/eclipse不会显示警告信息
      • 辅助生成的文档:
        • @author:作者
        • @version:版本
      • 代替生成的xml配置文件:
        • @WebServlet:Tomcat软件提供的,用于配置Servlet,代替web.xml的
    • 自定义注解:
      • 语法:@元注解public @interface 注解名{属性类型 属性名称() default 默认值;}
      • 元注解:用来限制自定义注解的注释
      • 常用的元注解有两个:
        • @Target:用来限制自定义注解可以用在什么地方。从ElementType里取值的,常用值有:
          • ElementType.TYPE:可以用在类、接口上
          • ElementType.METHOD:可以用在方法上
          • ElementType.FIELD:可以用在成员变量上
        • @Retention:用来限制自定义注解保留到什么阶段(生命周期)。从RetentionPolicy里取值,常用的:
          • RetentionPolicy.SOURCE:保留到源码阶段
          • RetentionPolicy.CLASS:保留到字节码阶段
          • RetentionPolicy.RUNTIME:保留到运行阶段
      • 注解的属性,并非所有的类型都可以,只支持:
        • 8种基本数据类型
        • String类型
        • Class类型
        • 注解类型
        • 枚举类型
        • 以及以上类型的一维数组形式
    • 注解的使用
      • 使用注解的语法:@注解名(属性名=值, 属性名=值, ...)
      • 注意:如果只有一个属性需要设置值,并且属性名称是value,可以简写成:@注解名(value的值)
    • 注解的解析
      • 给注解增加功能
      • method.isAnnotationPresent(Class annotationClass):判断方法上是否有指定注解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值