注解与反射
大约 4 分钟
注解与反射
注解和反射是框架 (myboost springboot) 的底层
- 参考:https://www.bilibili.com/video/BV1p4411P7V3(进度:p7 end)
CONTENTS
注解 Java.Annotation
注解使用
注解入门
- JDK 5.0 引入的新技术
- 注解和注释区别
- 注释 (Comment) 给人看的
- 注解 (Annotation) 是还能给程序看的
- 作用
- 不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
- 可以被其他程序 (比如编译器等) 读取
- 格式
- 以
@注释名
在代码中存在,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")
- 以
- 在哪里使用
- 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息 我们可以通过反射机制编程实现对这些元数据的访问
内置注解
@Override
// 定义在java.lang.Override中,此注释只适用于修辞方法﹐表示一个方法声明打算重写超类中的另一个方法声明
@Deprecated
// 定义在java.lang.Deprecated中,此注释可以用于修辞方法﹐属性,类,表示不鼓励程序员使用这样的元素﹐通常是因为它很危险或者存在更好的选择
@SuppressWarnings
// 定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息
// 与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了
@SuppressWarnings("all")
@SuppressWarnings("unchecked")
@SuppressWarnings(value="unchecked","deprecation"})
等等........
举例
public class Test01 extend Object {
@Override // 重写的注解,可以检查,如果下面是tostring,则会报错。有点类似于C++后面更新的override关键字
public String toString() {
Thread
return super.toString();
}
@Deprecated // 不推荐程序员使用,但是可以使用。你使用时会有个删除线的格式
public void test() {
System.out.println("Deprecated")
}
@SuppressWarnings("all") // 抑制住警告,这里all移植所有警告
public void test02() {
List list = new ArrayList();
}
}
元注解
作用
- 负责注解其他注解,Java定义了4个标准的
meta-annotation
类型,他们被用来提供对其他annotation类型作说明.
- 负责注解其他注解,Java定义了4个标准的
这些类型和它们所支持的类在
java.lang.annotation
包中可以找到。如下@Target 用于描述注解的使用范围 (即: 被描述的注解可以用在什么地方) @Retention 表示需要在什么级别保存该注释信息﹐用于描述注解的生命周期 (SOURCE< CLASS< RUNTIME) @Document 说明该注解将被包含在javadoc中 @Inherited 说明子类可以继承父类中的该注解
测试元注解
// 测试元注解
@MyAnnotation
public class Test02 {
public void test(){
}
}
// 定义一个注解
// Target 表示我们的注解可以用在什么地方。这里被用于方法上和类上面
@Target(value={ElementType.METHOD, ElementType.TYPE})
// Retention 表示我们的注解在什么地方还有效。runtime>class>soureces
@Retention(value=RetentionPolicy.RUNTIME)
// Documented 表示是否将我们的注解生成在JAVAdoc中
@Documented
// Inherited 子类可以继承父类的注解
@Inherited
@interface MyAnnotation {
}
自定义注解
- 使足
@interface
自定义注解时﹐自动继承了java.lang.annotation.Annotation
接口 - 分析:
- interface用来声明一个注解﹐格式: public @interface注解名
- 其中的每一个方法实际上是声明了一个配置参数
- 方法的名称就是参数的名称
- 返回值类型就是参数的类型(返回值只能是基本类型 , Class , String , enum)
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值
// 自定义注解
public class Test03 {
@MyAnnotation2(name = "秦疆")
public void test(){}
@MyAnnotation3("秦疆")
public void test2(){}
}
// 定义一个注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
@interfae MyAnnotation2{
// 注解的参数:参数类型 + 参数名()。注意这不是一个方法
String name() default "";
int age() default 0;
int id() default -1; // 如果默认值为-1,代表不存在
String[] schools() default {"清华大学", "西北大学"};
}
// 定义一个注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
@interfae MyAnnotation3{
// 如果只有一个值,建议用value命名。只有为value时才能不指定命名直接传参
String value();
}