Java的注解
Java的注解
注解一共分为3大类
- JDK自带注解
- 元注解
- 自定义注解
JDK注解:
- @Override :用来标识重写方法
- @SuppressWarnings(“deprecation”) 忽略警告
- @Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期
- @SafeVarargs jdk1.7出现,堆污染,不常用
- @FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用
元注解:
- @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 在运行时有效(即运行时保留)
- @Inherited 允许子注解继承
- @Documented 生成javadoc时会包含注解,不常用
- @Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用
自定义反射:
package com.cnblogs.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
本类用于实现自定义注解
*/
public class TestAnnotation {
}
/*
注意:自定义注解的语法与Java不同,不要套用Java的格式
*/
/*
注解定义时,需要使用 @interface 注解名 的格式
通过@Target注解表示自定义注解@Test可以使用的位置
使用@Target需要导包
通过“ElementType.”的方式来自定义注解@Test的可用位置
如果有多个值,可以使用“{,}”的格式来写
通过@Retention元注解表示自定义注解@Test的生命周期
使用@Retention需要导包
通过“RetentionPolicy.”的方式来指定自定义注解@Test的生命周期
表示这个注解可以存在到什么时期
源文件中:SOURCE
字节码文件中:CLASS
运行时:RUNTIME
注意:以上只能三选一
*/
@Target({ElementType.METHOD,ElementType.TYPE})
/*自定义注解能加在什么位置,取决于@Target注解的值 */
@Retention(RetentionPolicy.SOURCE)
@interface Test{
/*
自定义注解可以添加功能,给注解添加属性
*/
// int age();//这不是方法的定义,而是给自定义注解中定义age属性
//为了使用注解方便,可以给属性指定默认值,就可以不用像@Test(age = 1)这样赋值,直接@Test这样写了
int age() default 0;
/*
我们可以添加特殊属性value,这个名字是固定的
定义格式和普通属性一样,主要区别在于使用时不同
使用此注解给他赋值的时候,不需要写成”@Test(value = "apple")“,写成”@Test("apple")“
给value赋予默认值的时候和普通属性一样
*/
// String value();
String value() default "banana";
}
/*
使用注解时,只要在指定的自定义注解前面加上“@”符号即可使用此注解
*/
//@Test
/*
当我们添加了直接的age属性时,注解报错
当没有定义属性时可以直接使用,添加了属性,添加了属性就必须给属性赋值
*/
class TestAnno{
// @Test//报错,这里需要在@Target加上值ElementType.FIELD。
String name;
// @Test(age = 1) //注解的赋值 就不报错了
/*
给属性赋值的格式为“age = 1”,不能直接写1
*/
@Test("apple") //特殊属性value
public void eat(){
System.out.println("疯狂干饭!!!");
}
}