反射的概述
–
什么是反射
反射机制是在运行状态中,对于任意一个类可以获取这个类的属性和方法,对于任何一个对象能调用它任意属性和方法!这种动态获取信息和动态调用对方方法的功能机制就叫做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。