黑马程序员——学习笔记18.Java注解

来源:互联网 发布:中国金融发展知乎 编辑:程序博客网 时间:2024/05/23 15:55

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

注解(Annotation)

基本了解:

注解也是JDK1.5的新特性。注解就是一种标记,在程序中增加了注解就相当给程序增加了某种标记。注解是java的一个的类型(与接口很相似),它与类、接口、枚举是在同一个层次,它们都称作为 java 的一个类型(TYPE)。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它的作用非常的多。例如:进行编译检查、生成说明文档、代码分析等。

自定义注解:

1.格式:@interface注解名{

        public static final 属性名 = 属性值;

        public abstract 方法名();

 }

代码演示:自定义一个注解

package MyTest;@Retention(value=RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})public @interface AnnotationTest  {//定义注解的成员变量,默认是public final static类型的public final int a = 1;//定义注解的抽象方法,默认修饰符是public abstract,也必须有返回值类型。  8种基本类型,String,Class,枚举,注解和这些类型的数组public abstract String value()//default "黑马"; ;}
 

通过javap命令可以看到注解就是一种特殊的接口,跟接口一样都有成员属性和成员方法。

注意:

1.自定义注解时先声明注解的生命周期,就是使用@Retention 元注解。如果没有声明@Retention,就默认保留在源文件中。@Retention包含3中策略:

RetentionPolicy.SOURCE:指定注解只保留在源文件当中。

RetentionPolicy.CLASS:指定注解只保留在class 文件中。

RetentionPolicy.RUNTIME:指定注解可以保留在程序运行期间(二进制文件中)

2.再声明注解的功能使用范围,使用@Target元注解。如果没有声明@Target,就默认可以在任意类型的元素上都可以调用这个注解。@Target限定了8种元素类型:

ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。

ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。

ElementType.FIELD:说明该注解只能被声明在一个类的字段前。

ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。

ElementType.METHOD:说明该注解只能被声明在一个类的方法前。

ElementType.PACKAGE:说明该注解只能声明在一个包名前。

ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。

ElementType.TYPE:说明该注解只能被声明在一个类、接口(包括注释类型)或枚举前。

3.final静态成员属性默认是public static final修饰的,抽象的成员方法默认是pubic abstract修饰的。成员方法必须有返回值,返回值类型可以是:byte,short,char,int,long,boolean,float,double8种基本数据类型,还包括String,Class,枚举,注解类型以及上述类型的数组。

4.java.lang.annotation.Annotation是所有注解继承的公共接口,但在自定义注解时不需要声明出来,声明了extends Annotation会编译失败,同时Annotation是一个接口类型,不是一个注解类型。

注解的使用:

在可以声明的程序元素类型上直接调用。

格式:@注解名(方法名1=返回值,方法名2=返回值....)

以上述自定义注解AnnotationTest为例,可以直接在本注解上再调用自己。

代码:

@AnnotationTest(value = "黑马")

public @interface AnnotationTest{ 省略了代码... }

在这个注解中,只定义了一个成员方法并且返回值类型是String类型,在调用时可以省略value方法名,如下:

@AnnotationTest("黑马")

如果这个注解中的方法后有缺省的默认值,如下:

public abstract String value() default "黑马"

那么在调用注解时可以不用声明成员方法的返回值,如下:

@AnnotationTest

如果方法的返回值是个数组,而且数组的元素只有一个,可以去掉{}

代码演示:通过反射获取注解对象。

@AnnotationTest(value = "传智播客")public class AnnotationTestDemo {@AnnotationTest(value = "黑马")public static void main(String[] args) throws Exception {if(AnnotationTestDemo.class.isAnnotationPresent(AnnotationTest.class)){//获取类上的注解对象AnnotationTest an = AnnotationTestDemo.class.getAnnotation(AnnotationTest.class);//调用注解的成员方法。System.out.println(an.value());}Method methodMain =AnnotationTestDemo.class.getMethod("main", String[].class);if(methodMain.isAnnotationPresent(AnnotationTest.class)){//获取方法上的注解对象AnnotationTest an = methodMain.getAnnotation(AnnotationTest.class);//调用注解的成员方法。System.out.println(an.value());}}}


 

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

 

0 0
原创粉丝点击