反射的学习笔记

反射的概述

什么是反射

反射机制是在运行状态中,对于任意一个类可以获取这个类的属性和方法,对于任何一个对象能调用它任意属性和方法!这种动态获取信息和动态调用对方方法的功能机制就叫做java语言反射机制

反射的作用

  • 用来编写通用性较高的代码或者框架的时候调用

反射机制的实现

  • Class类与java.lang.reflect类库一起实现<反射>机制
    java.lang.reflect类库包含Field/Method/Constructors类。这些类型的对象由JVM在运行时出创建,分别用于获取未知类的域/方法/构造器:

  • 通过Class类和java.lang.reflect类包,未知对象的类信息在运行时被确定,并且在编译时无需获取;

获取放射的三种方式

  1. Class.fromname("包名+类名")
  2. Class cla=类名.class
  3. Class aclass=对象.getClass()

反射的常用方法

普通反射

  • 获取反射对象Class<?> aClass = Class.forName("/Users/gycmacbook/Downloads/Day01/Day13/src/Test.java ");

  • 获取对象的构照

    • Constructor<?> constructor=aClass.getConstructor("",...); 获取指定构造
    • Constructor<?> constructor[]=aClass.getConstructors("",...); 获取所有的构造
  • 获取元素的属性

    • Field field = aClass.getField("name"); 获取指定的公开属性
    • Field[] field = aClass.getFields("");获取所有公开属性
  • 获取方法
    • Method a = aClass.getMethod("a", int.class); 获取指定的方法 a:方法名 int.class 参数类型
    • Method[] methods = aClass.getMethods(); 获取所有的方法
    • Object o = aClass.newInstance(); a.invoke(o, 3); 获取该类对象调用类中方法

暴力反射

  • 获取反射对象:Class<Test> testClass = Test.class;
  • 获取对象的构照
    • Constructor<?> constructor=aClass.getConstructor("",...); 获取指定构造
    • Constructor<?> constructor[]=aClass.getConstructors("",...); 获取所有的构造
  • 获取对象的方法
    • Method a =testClass.getDeclaredMethod("a", int.class); 获取对象指定的方法 包括私有方法 a 方法名int 方法类型
    • Method[] declaredMethods = testClass.getDeclaredMethods();` 获取对象的方法 包括私有方法
  • 获取对象的属性
    • Field declaredField = testClass.getDeclaredField("b"); 获取指定的属性名 包括private修饰的

    • Field[] declaredFields = testClass.getDeclaredFields(); 获取所有的的属性名 包括private

      注解

概述:

Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口是在同一个层次

注解的作用

  1. 编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如 :@Override

  2. 代码分析:通过代码里标识注解,对代码进行分析。 例如 : @Test

  3. 配置文件:可以部分替代配置文件

  4. Properties

  5. 文件(项目需要配置信息) party.propeties

  6. 需要解析 : 将配置文件中的信息读取出来 new Properties();

  7. Annotation

  8. 注解(赋值): 设置了一些配置信息 (代码)

  9. 反射 : 注解的解析

  10. JDK提供的注解

  11. @Override 重写

  12. 被 override 注解修饰的方法必须是父类中重写方法或接口中的抽象方法

  13. @FunctionalInterface(JDK8) : 检测是否是函数式接口

  14. 被FunctionalInterface修饰的接口必须是函数式接口,才能通过编译

  15. SuppressWarnings 抑制警告

  16. 让编译器不要报出警告信息

自定义注解

  1. 定义注解名

    1. 使用 @interface 关键字定义注解类.

    2. 编写注解的名称, 名称以大写开头

    3. 定义注解属性

    4. 注解类只有属性,没有任何方法.

    5. 属性的格式为: 元素类型 属性名(); 格式类似于接口的抽象方法.

    6. 注解中只能定义 基本数据类型, 字符串类型, 类类型, 注解类型, 枚举类型 共12中类型数据.

    7. 如果需要给注解属性定义默认值, 请使用 default 关键字

    8. 如果注解中只有一个属性, 那么请将该属性定义为 value 名称. 好处: 使用该注解时可以省略 value=

    9. 元注解 : 注解的注解, 主要作用就是用来修饰自定义注解.

    10. @Target: 指明自定义注解可以使用的 位置

    11. Type 类型

    12. Method 方法

    13. Field 属性

    14. Retention:指定该注解的 保留策略

    15. source:源码

    16. class:编译

    17. runtime:运行时(反射读取都在阶段)

    18. 注解的使用

    19. 在类、方法、属性等相应位置使用注解

    20. 语法:@注解(属性1 = value,属性2 = value…)

    21. 自定义注解,一般在JVM运行时生效

  2. 注解的解析

  3. 注解需要反射机制获取!

  4. 接口 AnnotatedElement:表示目前正在此 VM 中运行的程序的一个已注释元素。该接口允许反射性地读取注释

  5. 实现类: Class, Constructor, Field, Method, Package ,AccessibleObject

  6. 方法

  7. getAnnotation(Class annotationClass)

    1. 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
  8. Annotation[] getAnnotations()

    1. 返回此元素上存在的所有注释。
  9. Annotation[] getDeclaredAnnotations()

    1. 返回直接存在于此元素上的所有注释。
    2. boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值