java注解试用及通过反射读取值

来源:互联网 发布:怎么用matlab编程 编辑:程序博客网 时间:2024/06/11 05:33
第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 默认值为“”
     
   
}
  @Target是注解类型
 1.CONSTRUCTOR:用于描述构造器
 2.FIELD:用于描述域
 3.LOCAL_VARIABLE:用于描述局部变量
 4.METHOD:用于描述方法
 5.PACKAGE:用于描述包
 6.PARAMETER:用于描述参数
 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
   @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

第二步
用Java反射写一个工具类读取注解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名称:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 运行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  运行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
写个测试类
@Target=TYPE时

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

输出: 水果名称:123
@Target=FIELD时
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 默认值为“”
     
   
}
  @Target是注解类型
 1.CONSTRUCTOR:用于描述构造器
 2.FIELD:用于描述域
 3.LOCAL_VARIABLE:用于描述局部变量
 4.METHOD:用于描述方法
 5.PACKAGE:用于描述包
 6.PARAMETER:用于描述参数
 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
   @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

第二步
用Java反射写一个工具类读取注解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名称:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 运行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  运行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
写个测试类
@Target=TYPE时

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

输出: 水果名称:123
@Target=FIELD时
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 默认值为“”
     
   
}
  @Target是注解类型
 1.CONSTRUCTOR:用于描述构造器
 2.FIELD:用于描述域
 3.LOCAL_VARIABLE:用于描述局部变量
 4.METHOD:用于描述方法
 5.PACKAGE:用于描述包
 6.PARAMETER:用于描述参数
 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
   @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

第二步
用Java反射写一个工具类读取注解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名称:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 运行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  运行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
写个测试类
@Target=TYPE时

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

输出: 水果名称:123
@Target=FIELD时
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}第一步
创建一个注解接口
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Fruit {
     public abstract String name() default "";// 默认值为“”
     
   
}
  @Target是注解类型
 1.CONSTRUCTOR:用于描述构造器
 2.FIELD:用于描述域
 3.LOCAL_VARIABLE:用于描述局部变量
 4.METHOD:用于描述方法
 5.PACKAGE:用于描述包
 6.PARAMETER:用于描述参数
 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
   @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

第二步
用Java反射写一个工具类读取注解
public class AnUtils {
   
     public static void getFruitInfo(Class<?> clazz){
           
            String strFruitName=" 水果名称:";
         
          
            Field[] fields = clazz.getDeclaredFields();
            //@Target=FIELD 运行
            for(Field field :fields){
                if(field.isAnnotationPresent(Fruit.class)){
                    Fruit fruitName = (Fruit) field.getAnnotation(Fruit.class);
                    strFruitName=strFruitName+fruitName.name();
                    System.out.println(strFruitName);
                }
             
            }
            //   //@Target=TYPE  运行

              if(clazz.isAnnotationPresent(Fruit.class)){
                Fruit fruitName = (Fruit) clazz.getAnnotation(Fruit.class);
                strFruitName=strFruitName+fruitName.name();
                System.out.println(strFruitName);
            }
        }
   
}

第三步
写个测试类
@Target=TYPE时

@Fruit(name="123")

public class AnnotionTest {
   
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

输出: 水果名称:123
@Target=FIELD时
public class AnnotionTest {
    @Fruit(name="123")
    public static  String name;
    public static void main(String[] args) {
      
        AnUtils.getFruitInfo(AnnotionTest.class);
    }
}

输出: 水果名称:123


原创粉丝点击