(一)反射机制
反射:是指程序可以访问、检测和修改它本身状态或行为的一种能力
反射机制:JAVA 有着一个非常突出的动态相关机制:Reflection(Java5 版本提供的高级新特性),JAVA反射机制是在
运行状态中,对于任意一个类,都能够知道该类的所有属性和方法;对于任意一个对象,都能够调用该对象的任意一个方法和属
性
反射的作用:可以实现动态创建对象和编译,体现出很大的灵活性,多用于框架(工作原理,对灵活性要求较高,反射机
制是构建框架技术的基础所在)和组件( JavaBean组件可以通过构造器来操作,利用反射在动态加载的时候来获取的 java 中类
的属性),写出复用性高的通用程序,还可以进行逆向代码(反编译器的原理)
在我们编写Java类文件时,真正运行的是编译之后的 . class 文件,而. class 文件文件在运行时,被加载到内存后,都是
一个Class类的对象,可通过Java5 提供的反射机制来获取到该类的构造器(Constructor)、成员变量(Field)及方法(Method)等
反射在项目里的应用:Java的反射机制主要运用在一些框架里,可以通过反射机制动态的获得对象和调用方法,在项目里
action里运用了反射机制来执行特定的方法。如果不运用反射机制,那么在该项目里,一个动作类就必须定义一个action(这是
因为当HTTPServletRequest请求到来时,会自动执行动作类里的execute方法)那必然会使action动作类,非常的繁杂,但其实
很多动作是一个模块里的操作,完全可以放到一个动作类里,然后通过反射机制动态获得动作类里的指定方法
(二)动态代理机制
动态代理的底层是Java反射机制,在框架的使用上面比较多,目标类和接口都是通过后期的配置文件去指定的,只要指定
了类名和接口,通过动态代理的方式去执行方法
总结:通过反射 + 动态机制(反射编程)和注解配置找到相应类或方法并执行(框架原理)
(三)注解(Annotation)
注解 Annotation 又叫元数据,是 JDK5 中引入的一种以通用格式为程序提供配置信息的方式注解(Java新特性),以@
注解名在代码中存在的,根据注解参数的个数,可以将注解分为:标记注解、单值注解、完整注解三类(都不会直接影响到程序
的语义,只是作为注解(标识)存在),可以通过反射机制编程实现对这些元数据的访问
注解的作用(重点)
(1)生成文档(最常见的,也是java 最早提供的注解,常用的有@see、@param、@return 等)
(2)跟踪代码依赖性,实现替代配置文件功能(常见的是spring 2.5 开始的基于注解配置,作用能减少配置,现在的框
架基本都使用了这种配置来减少配置文件的数量)
(3) 在编译时进行格式检查(如@Override放在方法前,如果该方法并不是覆盖了超类方法,则编译时就能检查出)
(4)从EJB3之后,EJB的实体Bean持久化技术被单独抽取出来形成了JPA技术,JPA和Hibernate3之后都支持使用
Annotation注解方式进行对象和关系型数据库映射(ObjectRelationship Mapping, ORM)
【注解的分类】
1、按运行机制(注解存在于程序的那个阶段)将注解分为三类:源码注解(只在源码存在)、编译注解(在class文件中
也存在)、运行时注解(在运行阶段仍然起作用)
2、按照来源:
(1)JDK自带的注解(Java目前只内置了三种标准注解:@Override、@Deprecated、@SuppressWarnings 以及四
种元注解:@Target、@Retention、@Documented、@Inherited)
@Override:常用在继承类或实现接口的子类方法上,表面该方法是子类覆盖父类的方法,该方法的方法签名
要遵循覆盖方法的原则:即访问控制权限必能比父类更严格,不能比父类抛出更多的异常
@Deprecated: 告诉编译器该元素是过时的,即在目前的JDK版本中已经有新的元素代替该元素
@SuppressWarnings:关闭编译器中不合适的警告,即强行压制编译器的警告提示
(2)第三方的注解——接触最多和作用最大的一类
(3)自定义注解——也可以看作是我们编写的注解,其他的都是他人编写注解
总结:
1、要用好注解,必须熟悉java 的反射机制,从上面的例子可以看出,注解的依赖完全依赖于反射(使用反射获取注解对
象)
2、不要滥用注解,平常我们编程过程很少接触和使用注解(只有做设计,且不想让设计有过多的配置时)
3、Annotations为注解,是编译器可以理解的部分,对编译有实际意义(注释是给人看的,注解是给机器看的)
4、注解只在源码存在,编译成 .class 文件就不存在