Java中反射(Reflection)就是对类信息的元数据的描述与操作,首先是对加载的类的信息的获得,其次是实例化和操作对象。
类信息有java.lang.Class提供描述。Class对象由三种方法获得,第一是调用对象的getClass()方法;第二是直接使用类的.class形式;第三是直接使用Class.forName(String)的形式;
和反射打交道使用较多的类是java.lang.reflect.Method、Field、Constructor分别对应方法调用、属性与属性修改、构造函数使用三个方面,具体api查看文档;数组类型比较特殊具体参考java.lang.reflect.Array。
关于反射的两个误解:反射代码速度很慢;反射代码都是复杂的;
――――如果使用得当,反射不会降低性能,正确的使用反射实际上应该改进代码的可维护性。反射的直接使用应该仅局限于基础机构类,不应该被分散到应用对象中。(Rod Johnson)
反射的api学习不是关键,关键是掌握其本质,并能够在实际中合适的使用它。掌握反射是一个认真的java程序员该做到的。实际中已用到的反射的例子:struts中formbean从请求中自动填充、apache的BeanUtil包;struts中DispatchAction根据参数传递的方法名字动态调用本实例的具体方法;工厂模式中根据参数传递的类名来动态加载并实例化一个产品。
动态代理
是jdk1.3提供的一种在运行时实现特定接口并生成相应代理实现,从而可以截取对该接口实现的调用。截取对每个实现方法的调用对处理提供了很大的空间,你可以在方法调用前后进行相关的处理,同时还可以随意调用非实现对象的方法。这种截取适用于资源的获得和释放、记录日志、获取性能信息等情况。动态代理是一种Aspect Oriented Programming (AOP)的实现,同时经常在容器和服务器级别使用。
实际使用动态代理的例子:代理Connection来自动关闭该连接打开的Statement;在业务方法前后添加日志记录。