您的位置:首页 > 编程语言 > Java开发

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

2017-08-29 11:36 357 查看
第一步

创建一个注解接口

@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);

            }

        }

   

}


4000
三步

写个测试类

@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: