注解,或者说叫注释类型。(Annotation)
注解Annotation是一种引用数据类型:
自定义注释的语法格式:
[修饰符列表] @interface 注解类型名{
}
public @interface MyAnnotation {
}
注解怎么用,用在哪儿?
注解使用时的语法格式是:@注解类型名。如:@Overwrite
注解可以出现在类上、属性上、方法上、变量上等。
注解还可以出现在注解类型上。
package com.tsccg.java;
/**
* @Author: TSCCG
* @Date: 2021/07/14 20:03
*/
@MyAnnotation01
public class AnnotitationDemo01 {
@MyAnnotation01
private String name;
@MyAnnotation01
public AnnotitationDemo01(@MyAnnotation01 String name) {
this.name = name;
}
@MyAnnotation01
public void m1() {
@MyAnnotation01
int i = 10;
}
@MyAnnotation01
public static void m2() {
}
}
@MyAnnotation01
interface Anno{
}
@MyAnnotation01
enum Season{
/**
* 春,夏,秋,冬
*/
@MyAnnotation01
SPRING,SUMMER,AUTUMN,WINTER
}
/**
* 自定义注解
*/
@MyAnnotation01
@interface MyAnnotation01 {
}
/**
* 另一个自定义注解
*/
@MyAnnotation01
@interface AnotherAnnotation{
}
java.lang包下的注解类型
public class AnnotationDemo02 {
@Override
public String toString(){
return null;
}
}
4.1什么是元注解?
我们先想一下,为什么Override注解只能使用在方法上呢?
我们可以查看一下Override源码:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
可见,有另一个注解@Target用来注解Override,作用是让Override只能用于方法上。
这种用于注解注解类型的注解,我们称之为元注解。
4.2常见的元注解
4.3关于Target注解
4.4关于Retention注解
Deprecated的作用:
主要向其他程序员传达一个信息,告知已过时,有更好的解决方案。
定义如下注解:
注解中有三个属性,其中一个定义了默认值。
package com.tsccg.java.annotation;
/**
* @Author: TSCCG
* @Date: 2021/07/14 20:13
*/
public @interface MyAnnotation {
//看似方法,实则为注解属性
String name();
int age();
//定义默认值
String address() default "中国";
}
在另一个类中使用该注解:
如果直接在方法上方用:@MyAnnotation 会报错。
需要填写注解属性:@MyAnnotation(name = "张三",age = 20)
address属性因为已设默认值,不写也没关系。
public class AnnotationDemo04 {
/*
报错,需要填写注解属性
@MyAnnotation
public void m1() {
}*/
//正确使用方式
//@MyAnnotation(属性名1 = 属性值1,属性名2 = 属性值2)
@MyAnnotation(name = "张三",age = 20)
public void m1() {
}
}
当属性名不是value时,使用时必须写上该属性名。
当一个注解中属性名为value,并且有且仅有一个属性,使用时可以不写属性名。(源码中有很多这样的注解)
当一个注解中有多个属性时,即使有属性名为value,使用时也不可以省略该属性名。
package com.tsccg.java.annotation;
/**
* @Author: TSCCG
* @Date: 2021/07/14 22:11
*/
public class AnnotationDemo04 {
//当属性名不是value时,使用时必须写上该属性名
@MyAnnotation1(name = "张三")
public void m1() {
}
//当一个注解中属性名为value,并且有且仅有一个属性,使用时可以不写属性名(源码中有很多这样的注解)
@MyAnnotation2("啦啦啦")
public void m2() {
}
//当一个注解中有多个属性时,即使有属性名为value,使用时也不可以省略该属性名
@MyAnnotation3(value = "啦啦啦",age = 20)
public void m3() {
}
}
@interface MyAnnotation1 {
String name();
}
@interface MyAnnotation2 {
String value();
}
@interface MyAnnotation3 {
String value();
int age();
}
原文:https://www.cnblogs.com/TSCCG/p/15013350.html