java注解
@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事
1、注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错,如下:
@override
public String toString(){
return "This is overrideTest";
}
2、注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时,在属性和方法上用@Deprecated修饰,如下:
@Deprecated
public void run(int x){
System.out.println("输出")
}
3、注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候,如下:
@SuppressWarnings({"unchecked","deprecation"})
public static void main(String[] args){
Map map = new TreeMap();
map.put("hello",new date());
System.out.println(map.get("hello"));
Date date=new Date();
System.out.println(date.toLocaleString());
}
4、注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。
RetentionPolicy.SOURCE – 在编译阶段丢弃。在源文件中有效,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中。@Override, @SuppressWarnings都属于这类注解。
RetentionPolicy.CLASS – 在类加载的时候丢弃。在class文件中有效,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;注解默认使用这种方式。
RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。在运行时有效,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用。我们自定义的注解通常使用这种方式。
@Retention(RetentionPolicy.RUNTIME )注解中,RetentionPolicy.RUNTIME是注解属性值,属性名字是value, 属性的返回类型是RetentionPolicy
5、注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型。
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Target – 说明了Annotation所修饰的对象范围。如果不明确指出,该注解可以放在任何地方。Annotation可被用于以下:
ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量。成员域(包括Enum常量)
ElementType.METHOD:方法
ElementType.PARAMETER:方法或构造器参数
ElementType.CONSTRUCTOR:构造器
ElementType.LOCAL_VARIABLE:本地变量
ElementType.ANNOTATION_TYPE:另一个注释。注解类型声明
ElementType.PACKAGE:用于记录java文件的package信息
如@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上
6、@interface自定义注解
首先,@interface不是接口是注解类,在jdk1.5之后加入的功能,使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface FruitName {
String value() default "";
}