注解
注解是程序的增强器,使用注解可以使得代码更简单高效。
注解的分类
JDK
注解- 元注解
- 自定义注解
JDK注解
注解 | 功能 |
---|---|
@Override |
标识重写方法 |
@Deprecated |
标记就表明这个方法已经过时了 |
@SuppressWarnings(“deprecation”) |
忽略警告 |
@SafeVarargs |
jdk1.7出现,堆污染,不常用 |
@FunctionallInterface |
jdk1.8出现,配合函数式编程拉姆达表达式,不常用 |
元注解
注解语法与Java不同,注解使用元注解定义。
元注解:用于定义注解的注解。
注解 | 功能 |
---|---|
@Target |
标记注解用在哪里:类上、方法上、属性上等等 |
@Retention |
标记自定义注解的生命周期:源文件中、字节码文件中、运行中 |
@Inherited |
允许子注解继承 |
@Documented |
生成javadoc时会包含注解,不常用 |
@Repeatable |
注解为可重复类型注解,可以在同一个地方多次使用,不常用 |
@Target注解
描述注解存在的位置:
ElementType.TYPE
应用于类的元素ElementType.METHOD
应用于方法级ElementType.FIELD
应用于字段或属性(成员变量)ElementType.ANNOTATION_TYPE
应用于注释类型ElementType.CONSTRUCTOR
应用于构造函数ElementType.LOCAL_VARIABLE
应用于局部变量ElementType.PACKAGE
应用于包声明ElementType.PARAMETER
应用于方法的参数
@Retention
定义注解被保留时间长短
SOURCE
在源文件中有效(即源文件保留)
CLASS
在class文件中有效(即class保留)
RUNTIME
在运行时有效(即运行时保留)
自定义注解
1.通过@Target
表示自定义住的@Test
可使用位置
使用”ElementType.
“的方式自定义使用位置,多个值使用{,}的格式
例如:@Target({ElementType.METHOD,ElementType.TYPE})
2.通过@Retention
表示自定义注解@Test的生命周期
使用”RetentionPolicy.
“的方式指定自定义注解的生命周期
例如:@Retention(RetentionPolicy.CLASS)
SOURCE:源文件中,CLASS:字节码文件中,RUNTIME:运行时
只能使用一个,不可同时使用多个
示例代码
package cn.tedu.annotation;
import javax.xml.transform.Source;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 实现自定义注解
*/
public class TestAnnotation {
public static void main(String[] args) {
}
}
/*
注解定义格式:@interface 注解名
1.通过@Target表示自定义住的@Test可使用位置
使用"ElementType."的方式自定义使用位置,多个值使用{,}的格式
例如:@Target({ElementType.METHOD,ElementType.TYPE})
2.通过@Retention表示自定义注解@Test的生命周期
使用"RetentionPolicy."的方式指定自定义注解的生命周期
例如:@Retention(RetentionPolicy.CLASS)
SOURCE:源文件中,CLASS:字节码文件中,RUNTIME:运行时
只能使用一个,不可同时使用多个
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.CLASS)
@interface Test{
/*
添加注解属性
int play();不是方法的定义,而是自定义注解中定义age属性
*/
int play() default 0;
/*
可以添加特殊属性value(固定名称)
定义格式与普通属性相同,主要区别在于使用时可以直接赋值,
例如:@Test("Code"),不需要写成@Test(value = "Code")
自定义注解类中给特殊属性value赋予默认值时的格式不可简写
*/
//String value();
String value() default "lemon";
}
/*
注解的使用
在自定义注解名字前加"@"即可使用
*/
//@Test
class TestAno{
/*
测试1:分别给TestAno类、name属性、play方法都添加@Test注解,不报错
测试2:将ElementType.TYPE,ElementType.FILED删除,只有方法上的注解不报错
结论:自定义注解可以使用位置,由@Target的值
*/
//@Test
String name;
/*
测试3:添加注解属性play后,将会报错
结论:当注解没有定义属性时可以直接使用,添加属性后,必须给属性赋值。
测试4:给@Test的play属性赋值后,不会报错。
结论:给属性赋值格式:@Test(play = 1120),不能直接赋值。
使用注解时可以给属性指定默认值,指定后便可不赋值直接使用。
格式:int play() default 0;
测试5:给play属性添加默认值后可直接使用注解,不需要赋值
测试6:给特殊属性value负值时可以简写,相当于(value = "apple")
测试7:两个属性都已经有默认值,可以直接使用@Test
*/
//@Test(play = 1120)
@Test("Code")
public void play(){
System.out.println("吃什么火锅,写代码不好吗?");
}
}