前言注解简介内置注解
@Retention@documented@Target@Inherited@Override@Deprecated@SuppressWarnings 测试内置注解元注解测试元注解自定义注解后续
前言前面已经提到java注解和反射是java的重要特征之一,上篇文章已经介绍了java反射,现在介绍一下注解,怎么说呢,注解比反射的内容要少一点,更容易理解一点,在框架中使用注解进行开发是常见的手段之一。
注解简介Annotation 是从JDK5.0开始引入的新技术 .
Annotation的作用
不是程序本身 , 可以对程序作出解释.(这一点和注释(comment)没什么区别)
可以被其他程序(比如:编译器等)读取.
Annotation的格式
注解是以"@注释名"在代码中存在的
还可以添加一些参数值 , 例如:@SuppressWarnings(value=“unchecked”)
Annotation在哪里使用?
可以附加在package , class , method , field 等上面 , 相当于给他们添加了额外的辅助信息
我们可以通过反射机制实现对这些元数据的访问
内置注解大多是专门的,但@SuppressWarnings是通用的
@Retention @documented @Target @Inherited @Override @Deprecated @SuppressWarnings@Retention
@Retention被设计为仅用作另一个注释的注释。它指定保留策略。
@documented@documented注释是一个标记界面,它通知工具要注释标记。
@Target@Target 注释指定了声明的类型可以应用注释。
它被设计为仅用作对另一注释的注释。 @Target接受一个参数,它必须是ElementType枚举的常量。
目标常量注释可以应用于
ANNOTATION_TYPE另一个注释 ConSTRUCTOR 构造函数 FIELD 领域 LOCAL_VARIABLE 局部变量 METHOD 方法 PACKAGE 包 PARAMETER 参数 TYPE 类, 接口, 或者 枚举
您可以在@Target注释中指定一个或多个这些值。 要指定多个值,必须在括号分隔列表中指定它们。 例如:
@Target( { ElementType.FIELD, ElementType.LOCAL_VARIABLE } )
@Inherited
@Inherited 是一个标记注释,只能用于另一个注释声明。它只影响将在类声明中使用的注释。 @Inherited 使得超类的注释由子类继承。
@Override@Override是只能在方法上使用的标记注释。使用@Override注释的方法必须覆盖超类中的方法。
@Deprecated@Deprecated是标记注释。表示不鼓励程序员使用这样的元素 , 通常是因为它很危险或者存在更好的选择
@SuppressWarnings@SuppressWarnings 指定可能由编译器发出的一个或多个警告被抑制。要禁止的警告由名称以字符串形式指定。此注释可应用于任何类型的声明。
测试内置注解 package com.annotation; //测试内置注解
import java.util.ArrayList;
import java.util.List; //所有类默认继承Object类
public class Test1 extends Object {
//@Override 表示方法重写
//--> 查看JDK帮助文档
//--> 测试名字不同产生的效果
@Override
public String toString() {
return super.toString();
}
//方法过时了, 不建议使用 , 可能存在问题 , 并不是不能使用!
//--> 查看JDK帮助文档
@Deprecated
public static void stop(){
System.out.println("测试 @Deprecated");
}
//@SuppressWarnings 抑制警告 , 可以传参数
//--> 查看JDK帮助文档
//查看源码:发现 参数类型 和 参数名称 , 并不是方法!
@SuppressWarnings("all")
public void sw(){
List list = new ArrayList();
}
public static void main(String[] args) {
stop();
}
}
元注解
元注解的作用就是负责注解其他注解 , Java定义了**4个标准的meta-annotation类型,**他们被用来提供对其他annotation类型作说明 .
这些类型和它们所支持的类在java.lang.annotation包中可以找到 .
( @Target , @Retention ,@documented , @Inherited )
@Target : 用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention : 表示需要在什么级别保存该注释信息 , 用于描述注解的生命周期
(SOURCE < CLASS < RUNTIME)
@document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
@MyAnnotation
public class Demo02_metaAnnotation {
@MyAnnotation
public void test() {
}
}
//定义一个注解
//@Target可以用在什么地方
//ElementType.METHOD方法上有效 ElementType.TYPE类上有效
@Target(value = {ElementType.METHOD, ElementType.TYPE})
//@Retention在什么地方有效
//RUNTIME>CLASS>SOURCES
@Retention(value = RetentionPolicy.RUNTIME)
//@documented 表示是否将我们的注解生成在Javadoc中
@documented
//@Inherited 子类可以继承父类的注解
@Inherited
@interface MyAnnotation { }
自定义注解
//自定义注解
public class Demo03_CustomAnnotation {
//注解可以显示赋值,如果没有默认值,就必须给注解赋值
@MyAnnotation2(name = "张三")
public void test() {
}
}
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
//注解的参数:参数类型+参数名()
//String name();
String name() default "";
int age() default 0;
int id() default -1;//-1代表不存在
String[] schools() default {"湖南中医药大学","6-405大学"};
后续
其实java注解还有其他的一些,像之前的myabtis中就导入了一个叫做lombok的插件,然后在实体类上加注解就可以不用写构造方法那些东西,精简了代码,总而言之,学无止尽!!



