JAVA注解及应用
Deprecated | 用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。 |
Override | 表示一个方法声明打算重写超类中的另一个方法声明。 |
SuppressWarnings | 指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。 |
package cn.itcast.day2; public class AnottationTest { /** * @param args */ @SuppressWarnings("deprecation") //告诉编译器,不要再提示我,我们知道是过时了的 public static void main(String[] args) { // TODO Auto-generated method stub System.runFinalizersOnExit(true); } @Deprecated //使此方法过时,别人再调用此方法时,就会提示已过时 public static void SayHello() { System.out.println("hi,我过时了的!"); } @Override //表明此方法是覆盖父类的某个方法,写错将无法编译 public String toString() { return "父类方法被覆盖了!"; } }
注解相当于一种标记,加了注解就等于为程序打上了某种标记,没加,则否。以后,javac编译器,开发工具和其它程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
java.lang包中,可以看到jdk提供的最基本的annotation
定义一个最简单的注解:
public @interface MyAnnotation {
}
把它加在某个类上:
@MyAnnotation public class AnnotationTest{
}
用反射进行测试AnnottationTest的定义上是否有@MyAnnotation
根据反射测试的问题,引出@Retention元注解的讲解,其三种取值:
RetetionPolicy.SOURCE、RettionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文—-> class文件à内存中的字节码。
演示和讲解@Target元注解
Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。
元注解以及基枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,近产索引即可查到,或都直接看java.lang.annotation包下面的类。
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, ElementType.TYPE}) public @interface ItcastAnnotation { }
package cn.itcast.day2; @ItcastAnnotation public class AnnotationTest { /** * @param args */ @SuppressWarnings("deprecation") //告诉编译器,不要再提示我,我们知道是过时了的 public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){ ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation); } } @Deprecated //使此方法过时,别人再调用此方法时,就会提示已过时 public static void SayHello() { System.out.println("hi,我过时了的!"); } @Override //表明此方法是覆盖父类的某个方法,写错将无法编译 public String toString() { return "父类方法被覆盖了!"; } }