注解
注解是程序的增强器,使用注解可以使得代码更简单高效。
注解的分类
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";}/*注解的使用在自定义注解名字前加"@"即可使用*///@Testclass TestAno{/*测试1:分别给TestAno类、name属性、play方法都添加@Test注解,不报错测试2:将ElementType.TYPE,ElementType.FILED删除,只有方法上的注解不报错结论:自定义注解可以使用位置,由@Target的值*///@TestString 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("吃什么火锅,写代码不好吗?");}}
