目录
反射
含义
每个类都在内存中保留有相应信息,这些信息保存于泛型类Class<?>中,每个实例或者静态类都可以动态获取Class<?>对象,从而在运行时知道对象类的内部信息,称之为反射。
使用
1.如果知道类名,可以直接通过类名.class获取Class<?>
2.Object下有一个getClass()方法返回一个Class<?>
3.Class类有一个静态方法forName(String name)可以通过类的名称返回Class<?>
作用
运行时动态获取类的具体信息,使用Class.forName()还可以将某个类直接加载到内存,常用于驱动器的加载
注解
含义
所谓注解,就是元数据(描述数据的数据),与注释不同,注解可以联合反射对注解所声明的类、字段、方法进行动态检验,执行代码等一系列操作。
如@Override,表明该方法必须被重写,否则直接报错。
注解为java注入元编程的能力,注解大量应用于各种框架,用于简化配置,提高灵活性,进一步抽象代码。
格式
public @interface 注解名称{
属性列表;
}
元注解
元注解,即注解的注解,定义一个注解实际上还是继承了接口Annotation,要想更方便使用注解必须约束注解的行为,即注解约束数据,元注解约束注解。
@Target() 用于约束注解的作用域,使用枚举ElementType选择,如果选择多个则使用{},如
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention()用于约束注解的保留时间段,有三个,使用RetentionPolicy选择,如果想通过反射获取注解信息则必须保留到运行时,即选择RUNTIME
@Retention(RetentionPolicy.RUNTIME)
@Inherited() 约束注解是否可以被继承,默认不继承,即父类有注解,但子类没有,子类默认不继承注解
本质
注解的本质是接口,所写的注解会被自动编译成接口interface并继承接口Annotation。
既然是接口,自然可以在内部声明抽象方法,但使用注解时可以给内部的方法名赋值,如
定义注解:
public @interface Lsl {
int getAge();
}
使用时就可以直接这样写@Lsl(getAge = 18),直接就