注解和反射
1. 注解
注解(Annotation):
-
Annotation是JDK5.0引入的新技术
-
Annotation的作用可以对程序做出解释、可以被其他程序读取
-
Annotation的格式:@注解名,参数值
-
Annotation的使用范围:package,class,method,field
2. 内置注解
@override:定义在java.lang.Override中,只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明
@Deprecated:定义在java.lang.Deprecated中,用于修饰方法、属性、类,表示不建议使用这样的元素
@SuppressWarnins:定义在java.lang.SuppressWarning中,用于抑制编译时的警告信息,使用时需要添加参数
3. 元注解
元注解的作用:负责注解其他注解
元注解类型:
-
@Target:用于描述注解的使用范围
-
@Retention:用于描述注解的生命周期,表示需要在什么级别保存该注释信息
-
@Document:说明该注解被包含在javadoc中
-
@Inherited:说明子类可以继承父类的该注解
4. 自定义注解
使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口
-
@interface用来声明一个注解,格式:public@interface 注解名{定义内容}
-
每个方法实际上声明了一个配置参数
-
方法名称就是参数的名称
-
返回值类型就是参数的类型(class,string,enum)
-
可以通过default来声明参数的默认值
-
只有一个参数成员,一般为value
-
注解元素必须有值,定义注解元素时,经常使用空字符串,0作为默认值
5. 反射
反射机制:反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能操作任意对象的内部属性及方法
加载完类之后,在堆内存的方法区中就产生了一个class类型的对象(一个类只有一个class对象),这个对象就包含了完整的类的结构信息,通过这个对象可以看到类的结构
反射方式:实例化对象---->getClass()方法---->得到完整的包类名称
反射提供的功能:
-
在运行时判断任意一个对象所属的类
-
在运行时构造任意一个类的对象
-
在运行时判断任意一个类所具有的成员变量和方法
-
在运行时获取泛型信息
-
在运行时调用任意一个对象的成员变量和方法
-
在运行时处理注解
-
生成动态代理
反射优点:可以实现动态创建对象和编译
反射缺点:对性能有影响
反射相关的API:
-
java.lang.Class:代表一个类
-
java.lang.reflect.Method:代表类的方法、
-
java.lang.reflect.Field:代表类的成员变量
-
java.lang.reflect.Constructor:代表类的构造器
6. class类
-
class本身也是一个类
-
class对象只能由系统建立
-
一个加载的类在JVM中只有一个class实例
-
一个class对象对应的是一个加载到JVM中的一个class文件
-
每个类的实例都会记得自己是由那个class实例所生成
-
通过class可以得到一个类中所有被加载的结构
获取class类的方法:
-
已知具体的类:Class Clazz = Person.class;
-
已知某个类的实例:class clazz = Person.getClass();
-
已知某个类的全类名:Class clazz = Class.forName("demo.User")
setAccessible:启动和禁用访问安全检查的开关
-
Method、Field、Constructor对象都有该方法
-
参数值为true表示在使用时取消java语言访问检查
-
参数值为true表示在使用时启用java语言访问检查
7. 反射操作泛型
作用:确保数据的安全性和免去强制类型转换问题,java采用泛型擦除的机制来引入泛型
编译完成后,和泛型有关的类型会被全部擦除