• 1. Java注解
  • 2. 主要内容JAVA放射机制 反射机制的功能 Class类 Java Reflection API 运用示例 代理模式 静态代理及示例 动态代理及示例 代理模式总结
  • 3. 注解(Annotation)简介Annotation(注解)是 JDK5.0 及以后版本引入的一个特性 注解是 Java 的一个新的类型(与接口很相似),它与类、接口、枚举是在同一个层次,它们都称作为 Java 的一个类型(TYPE)。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释。它的作用非常多,例如:进行编译检查、生成说明文档、代码分析等
  • 4. 元数据元数据:也叫java的注解,就是“关于数据的数据” 元数据的功能有很多。用 javadoc 的注释自动生成文档,这就是元数据功能的一种。总的来说,元数据可以用来创建文档,跟踪代码的依赖性,执行编译时格式检查,代替已有的配置文件(如Hibernate也提供了注释配置)
  • 5. JDK提供的几个基本注解(一)@SuppressWarnings:可以注释一段代码,该注解的作用是阻止编译器发出某些警告信息。它可以有以下参数: deprecation:过时的类或方法警告 unchecked:执行了未检查的转换时警告 fallthrough:当 switch 程序块直接通往下一种情况而没有 break 时的警告 path:在类路径、源文件路径等中有不存在的路径时的警告 serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告 finally:任何 finally 子句不能完成时的警告 all:关于以上所有情况的警告 用法: @SuppressWarnings(value={"unchecked"})         ……代码
  • 6. JDK提供的几个基本注解(二)@Deprecated:该注解的作用是标记某个过时的类或方法 用法:@Deprecated public void fun { …... } @Override:该注解用在方法前面,用来标识该方法是重写父类的某个方法 用法:@Override            public void fun() { …... }
  • 7. 元注解(一)元注解:专门负责注解其它的注解 元注解的种类 @Target @Retention @Documented @Inheried
  • 8. 元注解(二)@Target:它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前。它有以下参数: ElementType.TYPE:说明该注解只能被声明在一个类、接口(包括注解类型) 、 enum 前 ElementType.FIELD:说明该注解只能被声明在一个类的字段(域)前 ElementType.METHOD:说明该注解只能被声明在一个类的方法前 ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前 ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前 ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前 ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前 ElementType.PACKAGE:说明该注解只能声明在一个包名前 用法: @Target(ElementType.METHOD)     @Target(value=ElementType.METHOD)     @Target(ElementType.METHOD,ElementType.CONSTRUCTOR)
  • 9. 元注解(三)@Retention:它是被定义在一个注解类的前面,用来说明该注解的生命周期。它有以下参数: RetentionPolicy.SOURCE:指定注解只保留在一个源文件当中 RetentionPolicy.CLASS:指定注解只保留在一个 class 文件中 RetentionPolicy.RUNTIME:指定注解可以保留在程序运行期间
  • 10. 元注解(四)@Documented:目的就是让这一个 Annotation 类型的信息能够显示在 javaAPI 说明文档上;没有添加的话,使用 javadoc 生成 API 文档的时候就会找不到这一个类型生成的信息 @Inheried:允许子类继承父类中的注解
  • 11. 注解的生命周期一个注解可以有三个生命周期,它默认的生命周期是保留在一个 class 文件中,但它也可以由一个 @Retention 的元注解指定它的生命周期。 Java源文件: 当在一个注解类前定义了一个 @Retention(RetentionPolicy.SOURCE) 的注解,那么说明该注解只保留在一个源文件当中,当编译器将源文件编译成 class 文件时,它不会将源文件中定义的注解保留在 class 文件中 class 文件中: 当在一个注解类前定义了一个 @Retention(RetentionPolicy.CLASS)的注解,那么说明该注解只保留在一个 class 文件当中,当加载 class 文件到内存时,虚拟机会将注解去掉,从而在程序中不能访问 程序运行期间: 当在一个注解类前定义一个 @Retention(RetentionPolicy.RUNTIME)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解
  • 12. 注解的定义一个简单的注解: public @interface Annotation01 { //定义公共的 final 静态属性 …… //定义公共的抽象方法 …… } 注解的成员:注解和接口相似,它只能定义 final 静态属性和公共抽象方法 注解的方法: 方法前默认会加上 public abstract 在声明方法时可以定义方法的默认返回值,如: String color() default “blue”; String color() default {“blue”, “red”, ……} 方法的返回值的类型:可以有8种基本类型(byte, short, int, long, float, double, boolean, char,)、String、Class、枚举、注解及这些类型的数组
  • 13. 注解的使用注解的使用分为三个过程:定义注解-->声明注解-->得到注解 定义注解:详见见上页 PPT 声明注解 在哪些元素上声明注解:如果定义注解时没有指定 @Target 元注解来限制它的使用范围,那么该注解可以使用在 ElementType 枚举指定的任何一个元素前。否则,只能声明在 @Target 元注解指定的元素前。 一般形式: @注解名 对注解的方法的返回值进行赋值:对于注解中定义的每一个没有默认返回值的方法,在声明注解时必须对它的每一个方法返回值进行赋值。 一般形式:@注解名(方法名=方法返回值, ……) 如果方法返回的是一个数组时,那么将方法返回值写在{}符号里 @注解名(方法名={返回值1, 返回值2, ……}, ……) 得到注解:对于生命周期为运行期间的注解,都可以通过反射获得该元素上的注解实例 1、声明在一个类中的注解:可以通过该类 Class 对象的 getAnnotation 或 getAnnotations 方法获得 2、声明在一个字段中的注解:通过 Field 对象的 getAnnotation 或 getAnnotations 方法获得 3、声明在一个方法中的注解: 通过 Method 对象的 getAnnotation 或 getAnnotations 方法获得
  • 14. 总结注解可以看成是一个接口,注解实例就是一个实现该接口的动态代理类。 注解大多是用做对某个类、方法、字段进行说明,标识的。以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,来决定该做些什么处理或不该进行什么处理