注释 Annotation
1、定义:Annotation描述代码的代码(给机器看的)。
     区别:描述代码的文字,给人看的,英语里叫Comments。
     任何地方都可以使用Annotation注释,它相当于一段代码,可用来作自动检测。
     一个注释其实是一种类型(类class,接口interface,枚举enum,注释Annotation),注释本质上是接口。
     定义注释 public @interface Test{},注释都是Annotation接口的子接口
2、注释的分类:
  (1)、标记注释:没有任何属性的注释。@注释名
  (2)、单值注释:只有一个属性的注释。@注释名(value="***")
       在单值注释中如果只有一个属性且属性名就是value,则"value="可以省略。
  (3)、多值注释:有多个属性的注释。多值注释又叫普通注释。
       @注释名(多个属性附值,中间用逗号隔开)
3、内置注释(java.lang):
  (1)、@Override(只能用来注释方法)
       表示一个方法声明打算重写超类中的另一个方法声明。
       如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
  (2)、@Deprecated
       有 @Deprecated 注释的程序元素,不鼓励程序员使用,通常是因为它很危险或存在更好的选择。
       在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。 
  (3)、@SuppressWarnings(抑制警告,该注释效果与版本相关)
        指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
4、自定义注释
  (1)、定义注释类型
        自定义注释默认就是java.lang.annotation.Annotation接口的子接口。注释本质上就是一个接口。
        public @interface TestAnnotation {}
  (2)、为注释添加注释      

import java.lang.annotation.*;
         @Documented //能在帮助文档里出现
         @Inherited  //能否被继承下去
         @Retention(value = {RetentionPolicy.RUNTIME}) //注释该注释运行时仍然保留
          //@Retention默认是CLASS(保留到编译期),最短期是SOURCE(原代码级,编译时丢弃) 
         @Target(value={ElementType.METHOD,ElementType.FIELD})
         /*用来注释该注释能用来注释方法和属性,还可以定义它用来注释其他的,如类、注释、构造方法等等*/
         /*如果不写Target,默认是可以注释任何东西*/
         public @interface TestAnnotation {...}


  (3)、为注释添加属性方法
   

import java.lang.annotation.*;
         @Target(value={ElementType.TYPE})
         public @interface TestAnnotation {
         //如果一个注释不是标记注释,则还要定义属性;这属性同时也是方法,但不可能有参数,只可以有默认值
         String parameter() default "liucy";
         //给属性方法parameter添加一个默认值"liucy"
         //parameter()括号里不能写其他东西,类型只能是24种基本类型之一
         //24种类型:8种基本数据类型、String、枚举、注释、Class、以及它们的一维数组        
         }
         
         @TestAnnotation("haha")
         public class MyClass{...}

5、注释的注释:(元注释 meta annotation)
   都在 java.lang. annotation 包中
  (1)、Target:指示注释类型所适用的程序元素的种类。
        一个注释只能出现在其该出现的位置,Target是给注释定位的。
        例:@Target(value = {ElementType.METHOD}); //说明该注释用来修饰方法。
  (2)、Retention:指示注释类型的注释要保留多久。
        如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
        例:Retention(value = {RetentionPolicy.xxx})
        当x为CLASS表示保留到类文件中,运行时抛弃。
        当x为RUNTIME表示运行时仍保留(最常用)
        当x为SOURCE时表示编译后丢弃。
  (3)、Documented:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。
        应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。
  (4)、Inherited:指示注释类型被自动继承。
        如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,
        同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。
   注:在注释中,一个属性既是属性又是方法。

使用注释

/*********************************************/
 Class c = Class.forName(args[0]);
 Object o = c.newInstance();
 Method[] ms = c.getMethods();
     for(Method m:ms){
     //判断m方法上有没有Test注释
         if (m.isAnnotationPresent(Test.class)){
     //得到m之上Test注释parameter属性值
             Test t=m.getAnnotation(Test.class);
             String parameter=t.parameter();
             m.invoke(o,parameter);
 }}
 /*********************************************/