javase-annotation-210710-01
- 注解解释
- 元注解
- Retention源码
- Target源码
注解解释
1) 注解 也叫注释,Annotation
2) 注解Annotation是一种引用数据类型,编译之后也是生成xxx.class文件
3) 自定义注解,语法如下:
[修饰符列表] @interface 注解类型名{
}
4) 注解如何使用?在哪里使用?
注解使用语法格式:
@注解类型名
注解可以出现在类上,属性上,方法上,变量上等
注解还可以出现在注解类型上。
默认情况下,注解可以出现在任何位置。
5) JDK内置的注解
java.lang包下的注释类型:
Deprecated 用 @ Deprecated 注释的程序元素
不鼓励程序员使用这样的元素,通常是因为它很危险或是存在更好的选择
Override 表示一个方法声明打算重写超类中的另一个方法的声明
SuppressWarnings 指示应该在注释元素(以及包含在该注释元素中的所有程序元素)
中取消显示指定的编译器警告。
@Override
package bgy_annotation_01;
/*
@Overrid 源码如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
标示性注解,给编译器做参考
编译器看到方法上有这个@Overrid注解时,编译器会自动检查该方法是否重写了父类的方法
如果没用重写,会报错。
这个注解只是在编译阶段起作用,和运行期无关。
1. @Overrid 这个注解只能注解方法
2. @Overrid 这个注解是给编译器参考的,和运行阶段没有关系
3. 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。
*/
public class AnnotationTest01 {
@Override
public String toString(){
return "toString方法";
}
}
元注解
什么是元注解?
元注解就是来标注 “ 注解类型 ” 的 注解
常见的元注解
Target
Retention
关于Target注解:
这个一个元注解,用来标注 “ 注解类型 ” 的 注解
Target 注解用来标注 “被标注的注解”可以出现在哪些位置上。
@Target(ElementType.METHOD)
表示“被标注的注解”只能出现在方法上
关于Retention注解:
这个一个元注解,用来标注 “ 注解类型 ” 的 注解
Retention 注解用来标注 “被标注的注解”最终保存在哪里
1. @Retention(RetentionPolicy.SOURCE)
表示该注解只被保留在java源文件中。
2. @Retention(RetentionPolicy.CLASS)
表示该注解只被保留在class文件中。
3. @Retention(RetentionPolicy.RUNTIME)
表示该注解只被保留在class文件中,并且可以被反射机制所读取
Retention源码
Retention源码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
RetentionPolicy源码如下:
public enum RetentionPolicy {
SOURCE, // 表示该注解只被保留在java源文件中。
CLASS, // 表示该注解只被保留在class文件中。
RUNTIME // 表示该注解只被保留在class文件中,并且可以被反射机制所读取
}
Target源码
Target源码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
ElementType源码如下:
public enum ElementType {
TYPE, // 用于描述类、接口(包括注解类型) 或enum声明
FIELD, // 用于描述域
METHOD, // 用于描述方法
PARAMETER, // 用于描述参数
CONSTRUCTOR, // 用于描述构造器
LOCAL_VARIABLE, // 用于描述局部变量
ANNOTATION_TYPE,
PACKAGE, // 用于描述包
TYPE_PARAMETER, // 用来标注类型参数
TYPE_USE // 能标注任何类型名称
}
@Override理解
AnnotationTest01.java
package bgy_annotation_01;
/*
@Overrid 源码如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
标示性注解,给编译器做参考
编译器看到方法上有这个@Overrid注解时,编译器会自动检查该方法是否重写了父类的方法
如果没用重写,会报错。
这个注解只是在编译阶段起作用,和运行期无关。
1. @Overrid 这个注解只能注解方法
2. @Overrid 这个注解是给编译器参考的,和运行阶段没有关系
3. 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。
*/
public class AnnotationTest01 {
@Override
public String toString(){
return "toString方法";
}
}
自定义注解
MyAnnotation0201.java
package bgy_annotation_01;
public @interface MyAnnotation0201 {
/**
* 通常在注解中可以定义属性,如下就是MyAnnotation01的name属性
* 看者像方法,实际上被我们成为属性。
* @return
*/
String name();
}
MyAnnotation0202.java
package bgy_annotation_01;
public @interface MyAnnotation0202 {
/**
* 只有一个value属性时,可以使用的时候可以省略
* @return
*/
String value();
}
MyAnnotation0203.java
package bgy_annotation_01;
public @interface MyAnnotation0203 {
// 名字属性
String name();
// 性别属性
boolean sex();
// 年龄属性
int age();
// 颜色属性
// 可以指定默认值
String color() default "red";
}
AnnotationTest02.java
package bgy_annotation_01;
/*
1. 如果一个注解中有属性,那么必须给属性赋值
2. 如果一个注解中只有一个属性value,在使用的时候,该属性名可以省略value
*/
public class AnnotationTest02 {
// 报错原因:如果一个注解中有属性,那么必须给属性赋值
// @MyAnnotation0201()
// public void test(){
//
// }
// 语法格式:@MyAnnotation0201(属性名=属性值)
public void doSome(){
}
// 如果一个注解中只用一个属性value,那么可以省略属性名value
@MyAnnotation0202("value属性")
public void doOther(){
}
// 可以使用默认值color
@MyAnnotation0203(name="bgy",sex=true,age=15)
public void doAnything01(){
}
// 可以修改默认值color
@MyAnnotation0203(name="bgy",sex=true,age=15,color = "yellow")
public void doAnything02(){
}
public static void main(String[] args) {
}
}