首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师_Java之Annotation

2012-10-15 
黑马程序员_Java之Annotation---------------------- android培训、 java培训、期待与您交流! -------------

黑马程序员_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

热点排行