前言
动态语言:在程序运行时可以改变其结构,新的函数可以被引进;已有函数也可以被删除等结构上的变化。
从动态角度来看反射,反射机制在运行时,对任意的一个类能够知道这个类的所有属性和方法,并且对于任意对象,你能够调用它的任意的一个方法和属性。
编译时、运行时
java的许多对象在运行时都会出现两种类型:编译时类型、运行时类型。编译时的类型由声明对象时实用的类型决定;运行时的类型由实际赋值给对象的类型决定。
反射API用来生成JVM中的类、接口、对象 Class类:反射的核心类。可以获取类的属性、方法等信息 Field类:java.lang.reflec包下的类,表示类的成员变量,可以用来获取和设置类中属性 Method类:表示类的方法,用它来获取类的方法信息或执行方法 Constructor类:表示类的构造器
使用
获取Class对象的3中方法:
Person p = new Person();
Class c1 = p.getClass();
或者
Class c2 = Person.class;
或者
Class c3 = Class.forName("类的全路径")
当获取了Class对象后,就可以获取其所有方法信息和成员变量、构造器
Method[] m = c1.getDeclaredMethods();
Field[] f = c1.getDeclaredFields();
Construtor[] con = c1.getDeclaredConstrutors();
有了Class对象,就可创建类实例(类对象)
Person p = (Person)c1.newInstance();
或者
Constructor constructor = c1.getDeclaredConstructor(String.class,int.class);
Person zhangsan = (Person)constructor.newInstance("张三",18);
注解
Annotation 是java提供的一种对元程序元素关联信息和元数据的途径和方法。程序可以通过反射来获取程序中元素的注解对象,然后通过该注解对象来获取注解中的元数据信息。
四种标准元注解:@Target、@Retention、@Documented @Inherited
@Target:注解所修饰的对象范围:包、(类、接口、枚举、注解)、(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(循环变量、catch参数)
@Retention:注解被保留的时间长短,用于描述注解生命周期:源文件保留、class文件保留、运行时保留
@Documented: javadoc
@Inherited:是被继承的,如果一个类使用该注解修饰,那么它的子类也将被该注解修饰
在使用注解的过程中,很重要的一部分就是创建注解处理器。java SE5扩展了反射机制的API,以帮助程序员快速构建自定义注解处理器。