了解和入门注解的应用:
代码示例:
由上面的例子可以看出当执行一切过时的方法时,Eclipse会自动划线,提示开发人员此方法已过时,建议不要调用
此时如果在DOS命令行下运行,则会出现注意事项提醒:使用的方法已过时,如果需要了解详细信息,请使用:-Xlint:deprecation重新编译。
@SuppressWarnings("desprecation")
此时,在main方法上添加一个注解:@SuppressWarnings("deprecation"),此注解的作用就是告诉编译器,虽然我用的方法过时了,但是我还是坚持要用,你
就不要再提示了。
@Deprecated
有时候我们写的方法被别人调用了,但是如果这个方法有一些地方需要修改,可是如果我们修改了又会影响以前已经调用这个方法的程序。
由上面的示例可以看到,我们的sayHello方法可以通过@Deprecated注解标记为过时,然后调用者调用该方法的地方就会被MyEclipse划上横线作为过时的提示。这时候我们可以把这个方法设置为过时,然后重新写一个方法,这时候就需要用到@Deprecated注解。
例如:
public class AnnotationTest { public static void main(String[] args) { sayHello(); } @Deprecated public static void sayHello() { System.out.println("hi,黑马"); } }<span></span>
@Override
有时候我们写的某些方法需要覆盖父类的方法,但是可能方法名或者参数会出现不小心写错的情况。 这时候就可以为这个方法打上@Override注解,如果有任何差错,Eclipse
就会报错。
总结:
1、注解相当于一种标记,在程序中加了注解就相当于在程序上打了某种标记,没加,则相当于没有这种标记,以后,Javac编译器,开发工具和其他程序可以
用反射来了解你的类及各种元素上有无任何标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上;
2、看Java.long包,可以看到JDk中提供的最基本的annotation;
3、一个注解就是一个类,使用注解,就相当于创建了一个类的实例对象;
4、注解是JDK1.5的新特性。
注解的应用结构图:
注意:注解就相当于你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好注解这个类。就像你要调用这个类,得先有开发好的这个类。
创建注解类的步骤:
在Java透视图中,选择new--->Annotation; 如图所示:
点击FInish完成创建。
代码示例:
//注解类
public @interface itheimaAnnotation {
}
//应用了注解的类
@itheimaAnnotation
public class AnnotationTest {
public static void main(String[] args) {
boolean falg = AnnotationTest.class. isAnnotationPresent(itheimaAnnotation.class);
if (falg){
itheimaAnnotation heimaannotation = AnnotationTest.class. getAnnotation(itheimaAnnotation.class);
System.out.println(heimaannotation);
}
}
}
执行之后,控制台并没有打印出任何信息,原因是因为@HeiMaAnnotation注解的Retention元注解默认值
是RetentionPolicy.CLASS,也就是说@HeiMaAnnotation注解在运行的时候已经被过滤掉了。解决这个问题的方式就是 将@HeiMaAnnotation的RetentionPolicy元注解值设置为RetentionPolicy.RUNTIME。
注意:元注解就是在注解上添加的注解。@Retention元注解有三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME,分别对应:Java源文件-->class
文件-->内存中的字节码。
更改之后为:import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//注解类
@Retention(RetentionPolicy.RUNTIME)
public @interface itheimaAnnotation {
}
在执行程序,则打印为:@com.itheima_07.itheimaAnnotation();
@Override、@SuppressWarnings和@Deprecated这三个注解的@ Retention元注解的value属性值:
@ Override------->@Retention中的SOURCE属性;@SuppressWarnings-------->@Retention中的SOURCE属性;@Deprecated------->@Retention中的RUNTIME属性。
Taget:
Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface itheimaAnnotation {
}
改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就不会报错了。
//注解类
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface itheimaAnnotation {
}
注解的属性:
一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是黑马的学生,否则,就不是。如果还想区分出是黑马哪个班的学生,这时候可以为胸牌再增加一个属性来进行区分。
加了属性的标记效果为: @itheimaAnnotation (color= "red" )。 定义基本类型的属性和应用属性: 在注解类中增加String color(); 被添加的注解设置值:@itheimaAnnotation(color="red")。用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法 itheimaAnnotation itheimaannotation = AnnotationTest.class.getAnnotation(itheimaAnnotation.class);
System.out.println(itheimaannotation.color());可以认为上面这个@itheimaAnnotation是HeiMaAnnotaion类的一个实例对象。
为属性指定缺省值:String color() default "Yellow"; value属性:Stringvalue()default "黑马程序员"; 如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默
认值或者你只有一个value属 性),那么可以省略value=部分,例如:@itheimaAnnotation("CSDN社区")。
数组类型的属性 :
int [] arrayAttr() default{1,2,3}; 被添加的注解设置属性值:@itheimaAnnotation(arrayAttr={2,3,4})。 如果数组属性中只有一个元素,这时候属性值部分可以省略大括号。
枚举类型的属性 :
Lamp lamp() ; 被添加的注解设置属性值:@itheimaAnnotation(lamp=Lamp.GREEN)。
注解类型的属性:
MetaAnnotation annotationAttr() default@MetaAnnotation("黑马程序员"); 被添加的注解设置属性值:@itheimaAnnotation(annotationAttr = @MetaAnnotation("CSDN社区") ) 可以
认为上面这个@itheimaAnnotation是itheimaAnnotation类的一个实例对象,同样的道理,可以认为上面这 @MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotation ma = itheimaAnnotation.annotationAttr();
System.out.println(ma.value());