Java中的反射和注解

Posted 环球移动团队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的反射和注解相关的知识,希望对你有一定的参考价值。

反射

  反射是将类抽象为一个Class对象。将类看成对象,分析它的构造方法,成员变量,方法以及内部类。 
  对类的分析,是将类抽象为Class对象;对构造方法的分析,是将构造方法抽象为Constructor类的对象;对成员变量的分析,是将变量抽象为Feild类的对象;对方法的分析,是将方法抽象为Method类的对象。 
举个例子:

 1 public class Student {
 2     public String name;//定义学生姓名
 3     private int age;//定义学生年龄
 4     private String sex;//定义学生性别
 5     //获得学生姓名的方法
 6     public String getName() {
 7         return name;
 8     }
 9     //学生姓名赋值的方法
10     public void setName(String name) {
11         this.name = name;
12     }
13     //获得学生年龄的方法
14     public int getAge() {
15         return age;
16     }
17     //注意,这里没有为学生年龄赋值的方法,学生年龄为私有类型。
18 
19     //获得学生性别的方法
20     public String getSex() {
21         return sex;
22     }
23     //学生性别赋值的方法
24     public void setSex(String sex) {
25         this.sex = sex;
26     }
27 }
 1 public class Test {
 2     public static void main(String[] args) {
 3         Class<Student> clazz =Student.class;
 4         try {
 5             /Class Field   Method的使用。
 6 
 7             //获得Student类的name属性对象。
 8             Field field1  = clazz.getDeclaredField("name");
 9             //返回name字段的修饰符
10             System.out.println(field1.getModifiers());
11             //返回name字段的类型
12             System.out.println(field1.getType());
13             //返回name字段的名称
14             System.out.println(field1.getName());
15             //获得Student类的所有属性对象。
16             Field[] field2 = clazz.getDeclaredFields();
17             //遍历所有属性
18             for (Field field : field2) {
19                 System.out.println(field.getName());
20                 System.out.println(field.getType());
21                 System.out.println(field.getModifiers());       
22             }
23 
24             //为学生对象zhangsan没有set方法的私有类型age赋值
25             Student zhangsan = new Student();
26             //获得age属性的对象
27             Field age = clazz.getDeclaredField("age");
28             //取消对age属性的修饰符的检查访问,以便为age属性赋值
29             age.setAccessible(true);
30             //为age属性赋值
31             age.set(zhangsan, 18);
32             //回复对age属性的修饰符的检查访问
33             age.setAccessible(false);
34             System.out.println(zhangsan.getAge());
35 
36             //Method 的使用
37             Method method1= clazz.getDeclaredMethod("getName");
38             System.out.println(method1.getModifiers());

注解(Annotation)

注解的定义形式:

1  @interface 注解名{
2     <成员类型> <成员名称>() default "<默认值>"3     ……
4  }

下面这个例子定义了一个注解,注解名为MyAnotation,注解包含一个成员是int型的value()。@Retention表示注解的应用范围,注解的应用范围通常用RetentionPolicy中的枚举常量表示,这个例子中用的RetentionPolicy中的RUNTIME常量,表示在运行时加载注解到虚拟机,有效的范围最大。@Target表示次注解适用于变量类型,并且可为int类型的变量赋值。

技术分享图片 

此图片摘自博客园的……@黑色幽默Lion

1 @Retention(RetentionPolicy.RUNTIME)
2 @Target(ElementType.FIELD)
3 public @interface MyAnotation {
4     int value();
5 }
 1 import java.lang.reflect.Field;
 2 
 3 public class Student {  
 4     private String name;
 5     @MyAnotation(value =18)
 6     private int age;
 7     Student(){
 8         Class clazz = Student.class;
 9         try {
10             //获取age属性对象
11             Field field = clazz.getDeclaredField("age");
12             //创建注解对象,获取age属性的注解         
13             MyAnotation ma = field.getAnnotation(MyAnotation.class);
14             //判断获得的注解对象是否为空
15             if(ma!=null){
16                 //为age赋值
17                 int i = ma.value();
18                 field.setAccessible(true);
19                 field.set(this, i);
20                 field.setAccessible(false);             
21             }           
22         } catch (NoSuchFieldException | SecurityException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         } catch (IllegalArgumentException e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         } catch (IllegalAccessException e) {
29             // TODO Auto-generated catch block
30             e.printStackTrace();
31         }       
32     }   
33     public String getName() {
34         return name;
35     }
36     public void setName(String name) {
37         this.name = name;
38     }
39     public int getAge() {
40         return age;
41     }
42     public void setAge(int age) {
43         this.age = age;
44     }   
45 }

 



以上是关于Java中的反射和注解的主要内容,如果未能解决你的问题,请参考以下文章

注解与反射

Java中的注解和反射

Java中的注解和反射

注解以及注解在反射中的应用

Java注解教程:自定义注解示例,利用反射进行解析

基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解