A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 jinhu358 于 2013-5-23 21:08 编辑

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


JDK提供的几个基本注解
a. @SuppressWarnings 该注解的作用是阻止编译器发出某些警告信息。
b. @Deprecated 该注解的作用是标记某个过时的类或方法。
c. @Override 该注解用在方法前面,用来标识该方法是重写父类的某个方法。

元注解
元注解就是注解的注解;也可以理解为:原注解就是专门用来标记注解类型的;

Java中提供了四种元注解,专门负责注解其他的注解,分别如下
1,@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
----RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
----RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
----RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
2,@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
----ElementType.CONSTRUCTOR: 构造器声明
----ElementType.FIELD: 成员变量、对象、属性(包括enum实例)
----ElementType.LOCAL_VARIABLE: 局部变量声明
----ElementType.METHOD: 方法声明
----ElementType.PACKAGE: 包声明
----ElementType.PARAMETER: 参数声明
----ElementType.TYPE: 类、接口(包括注解类型)或enum声明
3,@Documented将注解包含在JavaDoc中
4,@Inheried允许子类继承父类中的注解



注解的定义
一个简单的注解:
public@interfaceAnnotation01{
         //定义公共的final静态属性.....
         //定以公共的抽象方法......
}
a.注解可以有哪些成员
    注解和接口相似,它只能定义final静态属性和公共抽象方法。
b.注解的方法
   1.方法前默认会加上publicabstract
    2.在声明方法时可以定义方法的默认返回值。
         例如:
         Stringcolor()default"blue";
         String[]color()default{"blue","red",......}3.方法的返回值可以有哪些类型
         8种基本类型,String、Class、枚举、注解及这些类型的数组。
c.使用注解(参照下面的注解使用)



注解的使用
注解的使用分为三个过程。
定义注解-->声明注解-->得到注解
a.定义注解(参照上面的注解定义)
b.声明注解
      1.在哪些元素上声明注解
           如果定义注解时没有指定@Target元注解来限制它的使用范围,那么该注解可以使用在ElementType枚举指定的任何一个元素前。否则,只能声明在@Target元
           注解指定的元素前。
          一般形式:@注解名()
      2.对注解的方法的返回值进行赋值
            对于注解中定义的每一个没有默认返回值的方法,在声明注解时必须对它的每一个方法的返回值进行赋值。
            一般形式:@注解名(方法名=方法返回值,、、、、、、)
            如果方法返回的是一个数组时,那么将方法返回值写在{}符号里
            @注解名(方法名={返回值1,返回值2,、、、、、、},、、、、、、、)
      3.对于只含有value方法的注解,在声明注解时可以只写返回值。
c.得到注解对于生命周期为运行期间的注解,都可以通过反射获得该元素上的注解实例。
      1、声明在一个类中的注解
       可以通过该类Class对象的getAnnotation或getAnnotations方法获得。2、声明在一个字段中的注解
       通过Field对象的getAnnotation或getAnnotations方法获得3、声明在一个方法中的注解
       通过Method对象的getAnnotation或getAnnotations方法获得
总结
注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。
注解大多是用做对某个类、方法、字段进行说明,标识的。以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,来决定该做些什么处理或不该进行什么处理

我们开始定义自己的注解MyAnnotation
  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;

  5. //VM将在运行时也保留注解,这样才可以通过反射机制读取注解的信息
  6. @Retention(RetentionPolicy.RUNTIME)
  7. //表示该注解可以在方法成员,和类型之上声明注解
  8. @Target({ElementType.METHOD, ElementType.TYPE})
  9. public @interface MyAnnotation {
  10.       //为注解添加属性
  11.       String color();
  12.       String value() default "我是注解中的value值"; //为属性提供默认值
  13.       int[]  array()  default {1, 2, 3};
  14. }
复制代码
接下来 我们来写一个AnnocationTest 类来使用我们刚刚定义的MyAnnotation 注解
  1. @MyAnnotation(color="red", value="Annoc",array={3,2,1})
  2. public class AnnocationTest {
  3. //声明注解
  4.         //注意这里  @MyAnnotation 中的只给了color参数 ;那么value的值为默认值,array的值也为默认值
  5.         //如果@MyAnnotation 中只有一个value成员的话这里可以写成   @MyAnnotation(value="Annoc")或者@MyAnnotation("Annoc")
  6.          @MyAnnotation(color="green")
  7.          public void testMethod(){
  8.                   System.out.println("Methodtest");
  9.          }
  10. }
复制代码
测试
  1. public class Test {
  2.          public static void main(String[] args) throws Exception {
  3.                   System.out.println("----------------------得到类上的注解----------------------");
  4.                  //检查类AnnotationTest是否含有@MyAnnotation注解
  5.                 if(AnnocationTest.class.isAnnotationPresent(MyAnnotation.class)){
  6.                         //若存在就获取注解
  7.                        MyAnnotation annotation = AnnocationTest.class.getAnnotation(MyAnnotation.class);
  8.                        System.out.println(annotation);
  9.                        //获取注解属性
  10.                        System.out.println(annotation.color());
  11.                        System.out.println(annotation.value());
  12.                       //数组
  13.                       int[] arrs=annotation.array();
  14.                       for(int arr:arrs){
  15.                           System.out.print(arr);
  16.                      }
  17.                 }
  18.                 System.out.println("----------------------得到方法上的注解----------------------");
  19.         //得到testMethod方法对象
  20.         Method method = AnnocationTest.class.getMethod("testMethod", null);
  21.          //检查方法testMethod是否含有@MyAnnotation注解
  22.        if(method.isAnnotationPresent(MyAnnotation.class)){
  23.                //若存在就获取注解
  24.               MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
  25.               System.out.println(annotation);
  26.             //获取注解属性
  27.              System.out.println(annotation.color());
  28.              System.out.println(annotation.value());
  29.             //数组
  30.             int[] arrs=annotation.array();
  31.             for(int arr:arrs){
  32.                  System.out.print(arr);
  33.             }
  34.        }
  35.         }
复制代码
运行结果
----------------------得到类上的注解----------------------
@annocation.MyAnnotation(value=Annoc, array=[3, 2, 1], color=red)
red
Annoc
321----------------------得到方法上的注解----------------------
@annocation.MyAnnotation(value=我是注解中的value值, array=[1, 2, 3], color=green)
green
我是注解中的value值
123


评分

参与人数 1技术分 +2 收起 理由
曹睿翔 + 2 赞一个

查看全部评分

3 个回复

倒序浏览
缺技术分呐 !   希望能多给俩个技术分
回复 使用道具 举报
不错不错  
回复 使用道具 举报
辛苦了~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马