/**
* 注解是一种引用数据类型,编译之后也是生成.class文件
* 语法:
* [修饰符列表] @interface 注解类型名{
*
* }
* 注解注意事项:
* 1、注解使用时语法格式:@注解类型名
* 2、注解可出现在类、属性、方法、变量上等...
* 注解也可出现在注解上。
*/
public class AnnotationTest01 {
/*
@Override这个注解只能注解方法
凡是方法中带有这个注解,编译器都会进行检查,若方法不是重写父类的方法,编译器报错
防止方法名写错!
*/
@Override
public String toString() {
return super.toString();
}
}
/**
* @Deprecated 表示这个注解标注的元素已过时!!
* 可用于告知自己或别人,这个东西已经过时辣!!!
*/
public class AnnotationTest02 {
public static void main(String[] args) {
doSome();//注意:在本类中调用这个被标注的过时方法时,不会出现横线
}
@Deprecated
public static void doSome(){
System.out.println("ds");
}
@Deprecated
public void dohero(){
System.out.println("dc");
}
}
class Dep{
public static void main(String[] args) {
AnnotationTest02 at = new AnnotationTest02();
at.dohero();//在别的类中调用时会出现横线!!
}
}
/**
* 元注解:
* 用来标注"注解类型"的"注解。
* 常见元注解:
* Target、Retention
* 关于Target注解:
* Target注解用来标注"被标记的注解"可以出现在哪些位置上。
* @Target(ElementType.METHOD):表示"被标注的注解"只能出现在方法上。
* @Target(ElementType.FIELD):出现在属性上。
* ....
* 如:下面的Override,只能出现在方法上!!!
* 关于Retention注解:
* Retention注解用来标注"被标注的注解"最终保存在哪里。
*
* @Retention(RetentionPolicy.SOURCE):表示该注解只能保留在java源文件中。
* @Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件中。
* @Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,且可以被反射机制所读取。
*
* 如:下面的Override,保留在源文件中。
*/
/*
这里的自定义Override注解只是我用来举例,实际上Override注解已经在java中写出,有疑惑可去查阅帮助文档!
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
自定义注解:
/**
* 自定义注解中有属性时!!!
* 注解当中的属性可以是哪一种类型?
* 属性的类型可以是:
* 基本数据类+String+Class+枚举类型
* 和以上每一种的数组形式
*/
public @interface MyAnnotation {
/**
* 注解中可以定义属性,以下是MyAnnotation的name属性
* 看着像方法,但实际上称为属性name
* @return
*/
String name();
/*
年龄
*/
int age() default 20;//属性指定默认值,指定完后,使用时不用再写进括号中!!!
/*
颜色
*/
String color();
/*
特殊的属性名!
*/
String value();
/*
邮箱,支持多个
*/
String[] email();
}
public class MyAnnotationTest {
/*错误写法:
MyAnnotation自定义注解当中有属性,
这里()中必须要给属性赋值,否则报错!
@MyAnnotation()
public void doSome(){}
*/
/*正确写法:(若自定义注解中只有一个属性)
@MyAnnotation(属性名=属性值)
@MyAnnotation(name="hellokitty")
*/
//正确写法:(有多个属性,用逗号隔开)
//这里age不用再写进括号中了,因为已经指定了默认值!
//有多个属性时value不可以省略!
//但若是只有一个属性且是value时,属性名可省略
//即直接写成@MyAnnotation("有点特殊")
//tip:当数组属性的属性值只有一个时,可省略大括号!
@MyAnnotation(name="hellok",color="黄色",value="有点特殊",email={"123@a.com.2@.cn"})
public void dosome(){}
}