反射的学习笔记
反射的概述
–
什么是反射
反射机制是在运行状态中,对于任意一个类可以获取这个类的属性和方法,对于任何一个对象能调用它任意属性和方法!这种动态获取信息和动态调用对方方法的功能机制就叫做java语言反射机制
反射的作用
- 用来编写通用性较高的代码或者框架的时候调用
反射机制的实现
Class类与java.lang.reflect类库一起实现<反射>机制
java.lang.reflect类库包含Field/Method/Constructors类。这些类型的对象由JVM在运行时出创建,分别用于获取未知类的域/方法/构造器:通过Class类和java.lang.reflect类包,未知对象的类信息在运行时被确定,并且在编译时无需获取;
获取放射的三种方式
Class.fromname("包名+类名")
Class cla=类名.class
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();` 获取对象的方法 包括私有方法
获取对象的属性
概述:
Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口是在同一个层次
注解的作用
- 编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如 :@Override
- 代码分析:通过代码里标识注解,对代码进行分析。 例如 : @Test
- 配置文件:可以部分替代配置文件
- Properties
- 文件(项目需要配置信息) party.propeties
- 需要解析 : 将配置文件中的信息读取出来 new Properties();
- Annotation
- 注解(赋值): 设置了一些配置信息 (代码)
- 反射 : 注解的解析
- JDK提供的注解
- @Override 重写
- 被 override 注解修饰的方法必须是父类中重写方法或接口中的抽象方法
- @FunctionalInterface(JDK8) : 检测是否是函数式接口
- 被FunctionalInterface修饰的接口必须是函数式接口,才能通过编译
- SuppressWarnings 抑制警告
- 让编译器不要报出警告信息
自定义注解
定义注解名
- 使用 @interface 关键字定义注解类.
- 编写注解的名称, 名称以大写开头
- 定义注解属性
- 注解类只有属性,没有任何方法.
- 属性的格式为: 元素类型 属性名(); 格式类似于接口的抽象方法.
- 注解中只能定义
基本数据类型, 字符串类型, 类类型, 注解类型, 枚举类型
共12中类型数据. - 如果需要给注解属性定义默认值, 请使用 default 关键字
- 如果注解中只有一个属性, 那么请将该属性定义为 value 名称. 好处: 使用该注解时可以省略 value=
- 元注解 : 注解的注解, 主要作用就是用来修饰自定义注解.
- @Target: 指明自定义注解可以使用的
位置
- Type 类型
- Method 方法
- Field 属性
- Retention:指定该注解的
保留策略
- source:源码
- class:编译
- runtime:运行时(反射读取都在阶段)
- 注解的使用
- 在类、方法、属性等相应位置使用注解
- 语法:@注解(属性1 = value,属性2 = value…)
- 自定义注解,一般在JVM运行时生效
- 注解的解析
- 注解需要反射机制获取!
- 接口 AnnotatedElement:表示目前正在此 VM 中运行的程序的一个已注释元素。该接口允许反射性地读取注释
- 实现类: Class, Constructor, Field, Method, Package ,AccessibleObject
- 方法
getAnnotation(Class annotationClass)
- 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
Annotation[] getAnnotations()
- 返回此元素上存在的所有注释。
Annotation[] getDeclaredAnnotations()
- 返回直接存在于此元素上的所有注释。
- boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
还没有评论,来说两句吧...