反射
反射是将类抽象为一个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 }