注解:
注解:给程序员和程序解释代码信息。
作用:可以作用于包、类、方法、属性上,给他们添加额外的信息。
tips:
- 不是程序本身,可以对程序作出解释(与注释(comment)类似)。
- 可以被其他程序(编译器)读取。
注解 和 注释 区别:
注释:向程序员解释代码信息。
注解:向程序员和程序解释代码信息。
内置注解:
内置注解:Java给我们提供给我们的一个注解。
//@Override表示该方法是重写父类的方法
@Override
public String toString() {
return super.toString();
}
//@Deprecated表示该方法已过时
@Deprecated
public void method01(){
}
//@SuppressWarnings表示镇压警告的注解
@SuppressWarnings("all")
public void method02(){
ArrayList list = new ArrayList();
list.add(100);
list.add(123.123);
list.add("今天天气真好!");
}
- @Override表示该方法是重写父类的方法。
- @Deprecated表示该方法已过时。
- @SuppressWarnings表示镇压警告的注解。
@SuppressWarnings:镇压警告,定义在java.lang.SuppressWarnings中用来抑制编译时的警告信息,需要添加参数才能正确使用。
@SuppressWarnings(“all”)抑制所有类型的警告信息。
@SuppressWarnings(“unchecked”)抑制单类型的警告信息。
@SuppressWarnings(value={“unchecked”,“deprecation”})抑制多类型的警告信息。
元注解:
元注解:负责解释(注解)其他注解。Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明。
元注解有:@Target,@Retention,@Documented,@Inherited 。
@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方,方法,类,参数等等)。
@Retention:表示需要要在什么级别保存该注择信息,用于描述注解的生命周期 。
(SOURCE(源码阶段[.java阶段])< CLASS([.class阶段])< RUNTIME(运行阶段))
@Document:说明该注解将被包含在javadoc中。
@lnherited:说明子类可以继承父类中的该注解。
//设置自定义注解使用范围为方法上。
@Target(ElementType.METHOD)
//设置自定义注解在运行阶段起作用。
@Retention(RetentionPolicy.RUNTIME)
//@interface不是定义接口,而是注解。
public @interface MyAnnotaction {
}
元注解中使用参数:
//静态导入
import static java.lang.annotation.ElementType.*;
//@Target(value={ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.TYPE_PARAMETER})
//@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.TYPE_PARAMETER})
//静态导入java.lang.annotation.ElementType,可以把ElementType去掉。
@Target({TYPE,FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
}
注解的使用范围:
- ElementType.TYPE 类上
- ElementType.FIELD 属性上
- ElementType.METHOD 方法上
- ElementType.PARAMETER 参数上
- ElementType.LOCAL_VARIABLE 局部变量上
- ElementType.TYPE_PARAMETER 泛型上
@MyAnnotaction
public class Test01<@MyAnnotaction T> {
public static void main(String[] args) {
}
@MyAnnotaction
String attr;
@MyAnnotaction
public static void method(@MyAnnotaction String str){
@MyAnnotaction
int i = 100;
System.out.println(i);
}
}
自定义注解:
//设置自定义注解使用范围为方法上。
@Target(ElementType.METHOD)
//设置自定义注解在运行阶段起作用。
@Retention(RetentionPolicy.RUNTIME)
//@interface不是定义接口,而是注解。
public @interface MyAnnotaction {
}
public class Test01 {
public static void main(String[] args) {
}
//使用自定义注解
@MyAnnotaction
public static void method(){
}
}
注解使用范围:
//静态导入
import static java.lang.annotation.ElementType.*;
//静态导入java.lang.annotation.ElementType,可以把ElementType去掉。
@Target({TYPE,FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
}
@MyAnnotaction
public class Test01<@MyAnnotaction T> {
public static void main(String[] args) {
}
@MyAnnotaction
String attr;
@MyAnnotaction
public static void method(@MyAnnotaction String str){
@MyAnnotaction
int i = 100;
System.out.println(i);
}
}
注解使用参数:
一个参数:
注解中定义变量后面要加小括号。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
//注解中定义变量后面要加小括号。
String value();
}
public class Test01 {
@MyAnnotaction(value="aaa")
public void method01(){
}
//自定义注解里面只有一个参数的情况,且这个参数是value,才可以把参数名省略。
@MyAnnotaction("bbb")
public void method02(){
}
}
参数为数组类型:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
String[] value() ;
}
public class Test01 {
@MyAnnotaction("aaa")
public void method01(){
}
@MyAnnotaction(value="bbb")
public void method02(){
}
@MyAnnotaction(value={"aaa","bbb"})
public void method03(){
}
}
参数默认值:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
String[] value() default "xyz";
}
public class Test01 {
//自定义注解有参数,且有默认值,则在注解使用中可以不写实参。
@MyAnnotaction()
public void method04(){
}
//自定义注解有参数,且有默认值,则在注解使用中,注解的小括号可以省略。
@MyAnnotaction
public void method05(){
}
}
自定义注解有参数,且有默认值,则在注解使用中可以不写实参。
自定义注解有参数,且有默认值,则在注解使用中,注解的小括号可以省略。
多个参数:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
String str1();
String str2();
String[] value() default {"xxx","yyy"};
}
public class Test01 {
@MyAnnotaction(str1="aaa",str2="bbb",value="ccc")
public void method01(){
}
@MyAnnotaction(str1="aaa",str2="bbb",value={"xxx","yyy","zzz"})
public void method02(){
}
//value参数有默认值,在注解使用中,value参数可以省略不写。
@MyAnnotaction(str1="aaa",str2="bbb")
public void method03(){
}
}