`
1enny
  • 浏览: 71055 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

第6单元:java5的注解

 
阅读更多
第6单元:java5的注解
33.了解和入门注解的应用   
      1.一个注解相当于一个类    
      2.注解相当与一个你的源程序中要调用的一个类,要在源程序中应用某个注解     
      就先准备好这个注解类,就像你要调用某个类,得先有开发好的类
总结:注解相当于一种标记,在程序当中加了注解就是相当于在程序打上了标记   
      没有加,则没有这种标记,以后在java编译器开发工具个其他程序就可以用    
      反射来了解你的类及各种元素上有何种标记,看你有什么标记,就干相应的事。   
      标记可以加上 包 类 字段 方法 方法参数 及局部变量。
34.注解的定义与反射调用
35.为注解增加各种属性
     java源文件-->class文件-->内存中(字节码文件)   
  元注解:注解的注解(@Retention(保存到什么期间上面三个),@Documented,@Target(针对目标)..);元数据,元信息
package java_5;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import java_5.EnumTest.TransLight;

class Person {
}

@XinYu(arr = { 1, 2, 3 }, value = "新余学院" , transLight = EnumTest.TransLight.GREEN ,
retentionModel = @Retention(value = RetentionPolicy.RUNTIME ))
public class AnnotationTest {
    @XinYu(value = "得到")
    private static Person person;

    // 假如数组只有一个值时,则直接写=?无需大括号
    @XinYu(arr = 4, value = "计算机")
    public static void main(@XinYu(value = "参数") String[] args)
              throws NoSuchMethodException, SecurityException {
         Field[] fields = AnnotationTest.class .getDeclaredFields();
          for (Field field : fields) {
              // 拿到属性上的注释
              if (field.isAnnotationPresent(XinYu .class)) {
                 Annotation annotation = field.getAnnotation(XinYu .class);
                 String value = (( XinYu) annotation).value();
                 System. out.println(value);
             }
         }

         Method method = AnnotationTest.class .getDeclaredMethod("main",
                 String[]. class);
          // 拿到方法参数上的注释
         Annotation[][] annoS = method.getParameterAnnotations();
          for (int a = 0; a < annoS.length; a++) {
              for (Annotation annotation : annoS[a]) {
                 String anno = (( XinYu) annotation).value();
                 System. out.println(anno);
             }
         }
          // 拿到方法上的注释
          if (method.isAnnotationPresent(XinYu .class)) {
             Annotation[] annotations = method.getAnnotations();
              for (Annotation annotation : annotations) {
                 String value = (( XinYu) annotation).value();
                 System. out.println(value);
             }
         }

          // 拿到类上的注释
          if (AnnotationTest.class .isAnnotationPresent(XinYu.class)) {
             Annotation annotation = AnnotationTest.class
                      .getAnnotation( XinYu.class );
             TransLight light = (( XinYu) annotation).transLight();
              Retention retetion = ((XinYu ) annotation).retentionModel();
             RetentionPolicy retentionPolicy = retetion.value();
             System. out.println(retentionPolicy.toString());
             System. out.println(light.nextLight());
             System. out.println(((XinYu ) annotation).value());
              // 在局部变量中注解是没有意义的,因为方法的调用随时可以,不存在随时注入
              // @XinYu(value = "TestValue")
              // Type c = annotation.annotationType();
              // Class clazz = c.getClass();
              // Annotation annotation2 = clazz.getAnnotation(XinYu.class);

         }
    }
}

package java_5;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//Type is the common superinterface for all types in the Java
//include raw types, parameterized types,array types, type variables and primitive types.
//注释你这个注解保留到什么阶段(三阶段)
@Retention(value = RetentionPolicy.RUNTIME)
// 在哪个地方可以用这个注解,相同类型的注解用数组标识
@Target(value = { ElementType. FIELD, ElementType.METHOD, ElementType .TYPE ,
         ElementType. LOCAL_VARIABLE,ElementType .PARAMETER })
public @interface XinYu {
    // 注解中可以定义属性,也可以定义默认值
    int[] arr() default { 5, 6, 7 };

    // 当属性名为value时可以在调用时不写value=?(前提只有value被调用了)
    String value();

    // 注解中用了枚举
    EnumTest.TransLight transLight() default EnumTest.TransLight.RED ;
    //注释中用到注释
    Retention retentionModel() default @Retention(value = RetentionPolicy.RUNTIME);
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics