什么是注解?
注解(Annotation)从JDK5.0引入的新技术。
Annotation的作用:
- 不是程序本身,可以对程序作出解释(与注释(conment)没有什么区别)
- 可以被其他程序或者是编译器读取
Annotation的格式:
@+注释名 形式存在,还可以再注解后面添加一些参数值
如:@SuppressWarnings(value=“unchecked”)
Annotation在何处使用?
可以在package、class、method、field处上面,相当于给他们添加了额外的辅助信息,
我们可以通过反射机制编程实现对这些元数据的访问
注解还有检查和约束的作用,在使用注解的时候,会自动的对所注解的对象进行检查
内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解:
@Override :检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated : 标记过时方法。如果使用该方法,会报编译警告。加了注解之后,调用此方法就会显示,不推荐程序员使用,,或者有更好的方式,但是可以使用。
@SuppressWarnings : 用于抑制编译器产生警告信息。
@SuppressWarnings(“all”)
@SuppressWarnings(“unchecked”)
@SuppressWarnings("value={“unchecked”,“deprecation”})
……
元注解:作用在其他注解的注解:
四个标准的元注解:
- @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。( value= [ sourcee<class<runtime ] )
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
- @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
举例:实现一个自己的注解·
package src;
import java.lang.annotation.*;
public class test1 {
// 表示使用自己的注解
@MyAnnotation
public void test(){
}
}
// 创建一个自己的注解
@Documented
// 表示是否将我们的注解生成Javadoc中
// 表示我们的注解在什么地方使用(runtime,class,source)
@Retention(value = RetentionPolicy.RUNTIME)
// target:表示我们的注解所在的作用域
//@Target(value = ElementType.METHOD)
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
}
案例使用 自定义注解:
- 使用@interface 自定义注解时,自动继承了Java.lang.annottation.Annotation接口
分析: - @interface用来声明一个注解,格式@+自定义的注解名{定义内容 }
如果在类里面定义省略public - 注解的括号里面是配置参数
- 方法的名称就是参数的名称
- 参数值只能是基本类型
- 可以通过default声明参数的默认值
- 如果只有一个参数成员,一般参数名为value,也可以省略不写
- 注解元素必须要有值,定义元素时经常使用空字符串或者0作为默认值
示例代码:
package src;
import java.lang.annotation.*;
public class test1 {
// 使用自己的注解
// @MyAnnotation(name = "")
@MyAnnotation(value = "")
public void test1(){
}
}
// 创建一个自己的注解
@Documented
// 表示是否将我们的注解生成Javadoc中
// 表示我们的注解在什么地方使用(runtime,class,source)
@Retention(value = RetentionPolicy.RUNTIME)
// target:表示我们的注解所在的作用域
//@Target(value = ElementType.METHOD)
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
// 注解的参数:参数类型+ 参数名();
// 此时在name的后面可是否添加default;不添加的话,
// 当调用此注解的时候必须赋值参数的值,反而如果default就会在调用注解的时候不需要设置参数的值
// String name() ;
String value() ;
}