注解&反射
- 注解
什么是注解
注解(Annotation),也叫元数据,标签(便利贴),注释。注解有时候,也叫注释,但是容易和java的注释混淆, 一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
注解的作用
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】比如api文档; |
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】 (可以通过反射 看这个类有没有注解,有注解的时候,代码应该怎么写,没有注解的时候,应该怎么写) |
注解的使用
注解怎么写:
@ + 注解的名称 -- 比如@Overridev ->注解
它可以贴在方法,类,字段....
注解3要素
|
|
|
使用场景
注解作用:
- 在框架里面使用
- @Override 可以检查 是否是覆写的方法、测试@Test等等
- 反射
什么是反射
- 建立知识共识
- 要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载;
- Java类如果不被Java虚拟机加载,是不能正常运行的;
- 我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类已经被加载了;
相对官方解释:
- 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力;
- 在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息);
反射的作用
1、增加程序的灵活性,避免将程序写死到代码里(解除硬编码的问题);
2、Java的反射机制它知道类的基本结构,可以动态的去获取类这样的结构的结构;
3、可以让程序员在不知道其它程序员会有什么类的时候就编写完成自己的代码;
4、反射的优点:灵活,功能强大(可以拿到私有的....);
5、反射的缺点:破坏封装,影响性能;
反射常用API
- java.lang.Class
- java.lang.reflect.Constructor
- java.lang.reflect.Method
- java.lang.reflect.Field
- 注意: lang包下面的直接类型是自动导入的,但是lang包的子包中的类型需要我们自己导入的,到时候不要忘记了哦
获得Class实例
类、接口、数组、基本数据类型和void
需要:获得String类中有哪些字段
1、Class中有获得一个类中成员(字段)的方法
Field[] getFields()
2、首先获得Class对象
Class的对象包括类、接口
需要获得String对象的Class的对象 String.class
测试获得对应的Class示例的方式:
1、Class中的一个静态方法 Class.forName(String className)
2、Object的getclass()方法
3、类名.class
创建类的方式
创建类的方式
1、通过构造方法new
2、通过工厂获得
3、通过类提供的静态方法
4、通过反射
①在Class中提供一个方法用来创建对象的
<T> newInstance()创建此Class对象所表示的一个新实例
②通过得到的构造器对象Construct对象来创建一个对象
获得构造方法
获得类中指定的方法
使用Field获得字段
反射小结
- 虽然外面可以操作类中私有的成员了,但是从某种程度上讲破坏了封装,所以非常特殊的时候才可能用到;
- Class类的实例可能是不同的类型的(类,接口,数组。。。),而我们对类,接口或者数组的操作是不一样的(例如:你得到的Class实例是一个接口,而你还想尝试通过反射去得到其中的构造方法,这显然是不合适的),所以在Class中还提供了很多判断Class实例是什么类型的方法: