黑马程序员_Java之Annotation
---------------------- android培训、 java培训、期待与您交流! ----------------------
?
???????????? 注解(Annoation)也是在jdk 1.5中提供的新特性,Annotation可以用来
修饰类、属性、方法。系统提供了3个内建的Annotation类型,可直接使用。
?
???????????? --> @Override :表示覆写的Annotation.
?
???????????? --> @Deprecated :表示不建议使用的Annotation.
?
?????????????--> @SuppressWarnings:表示可以压制安全警告的Annotation.
?
?????????1. @Override?使用在方法覆写的时候,其作用就是保证方法复写正确,如果在程序中定义了该注解,?当程序中覆写方法错误是在编译时就会报告错误,举一个简单的列子:
????????? 示例代码如下:
package heima.javaenhance.annoation;abstract class Horse{public abstract String getInfo();}public class BlackHorse extends Horse{public static void main(String[] args) {}@Overridepublic String getinfo() {return "我是一匹黑马!";}}?
?????????? 在命令行窗口下编译时:
????????????????????BlackHorse.java:7:heima.javaenhance.annoation.BlackHorse
?????????????????? ?不是抽象的,并且未覆heima.javaenhance.annoation.Horse
??????????????????? 中的抽象方法 getInfo()
????????????????????public class BlackHorse extends Horse{
???????????????????????????? ^
????????????????????BlackHorse.java:12: 方法不会覆盖或实现超类型的方法
??????????????????????????????? @Override
?????????????????????????????? ?^
????????????????????2 错误
?
?
??????????2.@Deprecated 主要作用就是要告诉编译器一个类、方法、变量等已过时,举一个简单的列子:
????????? ?示例代码如下:
package heima.javaenhance.annoation;class Test {@Deprecatedpublic String say() {return "haha";}}public class DeprecatedTest {public static void main(String[] args) {Test test = new Test();System.out.println(test.say());}}?
?????????在命令行窗口下编译时:
???????????????????? 注意:DeprecatedTest.java 使用或覆盖了已过时的 API。
???????????????????? 注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
?
?
??????????3.@SuppressWarnings 可以对编译器报出的警告信息进行压制,不让其显示出来。
???????? 示例代码如下:
package heima.javaenhance.annoation;import java.util.ArrayList;public class SuppressWarningsTest01 {public static void main(String[] args) {ArrayList list = new ArrayList();list.add("A");list.add(1);System.out.println(list);}}?
?
?????????在命令行窗口下编译时:
??????????????????? SuppressWarningsTest01.java:8:
??????????????????? 警告:[unchecked] 对作为普通类型 java.util.ArrayList的成员
??????????????????? 的 add(E) 的调用未经检查
?????????????????????????????????? list.add("A");
???????????????????????????????????????????????? ^
??????????????????? 1 警告
?
?????????在Java语言规范(Java Language Specification)中对Annotation的定义如下:
?
??????AnnotationTypeDeclaration:
???????????InterfaceModifiersopt @ interface Identifier AnnotationTypeBody
??????可以在Annotation的内部定义元素、常量、类、接口、枚举(Enum)等类型, 其定义如下:
????? AnnotationTypeElementDeclaration:
?????????? AbstractMethodModifiersopt Type Identifier ( ) DefaultValueopt ;
???????????ConstantDeclaration
????????? ?ClassDeclaration
?????????? InterfaceDeclaration
?????????? EnumDeclaration
?????????? AnnotationTypeDeclaration
?????????? ?;
?????? ?DefaultValue:
????????? ?default ElementValue
?????? 下面定义一个Annotation:
???? ?@interface MyAnnotation {String name();int age();}
?
????? 对Annotation中的属性设置值,也可在定义Annotation的时候设置默认值:
?
? ? ?class UseMyAnnoation {@MyAnnotation(name = "张三", age = 30)public String getInfo() {return "hello";}}@interface MyAnnotation {String name() default "张三";int age() default 30; }
?
?
enum Name {张三, 李四, 王五;}@interface MyAnnotation {public Name getName() default Name.张三;}?
?
?? 下面对Retention和RetentionPolicy的用法进行简单的分析:
?
????????Retention类中定义了一个RetentionPolicy类型的变量,该类型有三个取
值,分别表示三中不同的作用范围,Retention类使用RetentionPolicy中的三个属
性来指定Annotation类型的保存范围。
?
?????????? --> CLASS 指定成该范围的Annotation的类型将保留在源文件(*.java)
???????????????? 和编译之后的的类文件(*.class)中,这些Annotation信息将不会
?????????????????被Java虚拟机(JVM)加载到内存中,若果一个Annotation没有指
???????????????? 定保存的范围,其默认就是CLASS范围。
?
?????????? --> RUNTIME 指定成该范围的Annotation的类型将保留在源文件
???????????????? (*.java)、编译之后的类文件(*.class)、这些Annotation信息还能
???????????????? 被Java虚拟机加载到内存。
?
?????????? --> SOURCE 指定成该范围的Annotation的类型只能保存在源文件
???????????????? (*.java)中,编译之后不会保存在类文件(*.class)中。
?
?
????? 下面写一个例子,使用反射取得Anntation中的信息:
?
package heima.javaenhance.annoation;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.reflect.Method;enum Name {张三, 李四, 王五;}@Retention(value = RetentionPolicy.RUNTIME)@interface MyAnnotation {public Name name() default Name.张三;int age() default 30;}class UseMyAnnoation {@MyAnnotation(name = Name.张三, age = 30)public String getInfo() {return "hello";}}public class MyAnnotationTest01 {public static void main(String[] args) throws ClassNotFoundException,SecurityException, NoSuchMethodException {// 通过反射加载UseMyAnnotation这个类Class<?> clazz = Class.forName("heima.javaenhance.annoation.UseMyAnnoation");// 得到UseMyAnnotation类中的getInfo()方法Method method = clazz.getMethod("getInfo");// 判断一下在这个方法上是否有一个名为MyAnnotation的注解if (method.isAnnotationPresent(MyAnnotation.class)) {// 取得这个MyAnntation类的一个实例化对象MyAnnotation ma = method.getAnnotation(MyAnnotation.class);// 取得MyAnntation中的元素内容Name name = ma.name();int age = ma.age();System.out.println("姓名:" + name + ",年龄:" + age);}}}?
?????????? 输出结果:?姓名:张三,年龄:30
???????
?
?
---------------------- android培训、java培训、期待与您交流! ----------------------
?
详细请查看:http://edu.csdn.net/heima