1. Annotation:注解。是JDK5.0以上版本提供的可以添加到代码之上的修饰符,用来对该代码进行解释和说明。
1) 可以放置在类的任何组成部分,如:包声明、类(或接口)声明、构造方法、普通方法、成员变量、参数和局部变量。
2) 注解的使用不会影响代码的功能。
2. Java SE API中提供了三个内置注解类型:定义在java.lang包中。注解类型使用时要用@符来引用。
1) Override:表示一个方法声明打算重写超类中的另一个方法声明。只能用在方法上。它只会保存在源文件中,编译成字节码时会被丢弃。
2) Deprecated:它修饰元素时表示不鼓励程序员使用这样的元素。它可以添加到类的任何位置。它会编译到字节码中,并且JVM可以获取它的信息
3) SupressWarnings:用来阻止编译器警告。它可用在除包以外的任何位置。它带有一个属性叫value,指定要阻止的警告集。
3. 自定义注解。注解的定义类似于接口。
1) @interface来定义注解类型。
public @interface MyAnno{}
2) 通过定义一个同名方法可以在注解类型中添加一个属性,返回值类型就是这个属性的类型。
public @interface MyAnno{
String name();
String[] value();
}
3) 默认创建的注解类型可以使用类的任何位置。
4. 注解的注解,也叫无注解。它用来指定自定义的注解类型可对放置的位置,保留多久,是否可文档化。内置的元注解定义在java.lang.annotation包中:
1) Target:指示注释类型所适用的程序元素的种类。它的属性value要指定为ElementType的枚举值之一:
TYPE, //适用于 类,接口,枚举
FIELD, //适用于 成员字段
METHOD, //适用于 方法
PARAMETER, //适用于 方法的参数
CONSTRUCTOR, //适用于 构造方法
LOCAL_VARIABLE, //适用于 局部变量
ANNOTATION_TYPE, //适用于 注解类型
PACKAGE //适用于 包
2) Retention:用来告诉编译器如何处理当前注解。它的属性value要指定为RetentionPolicy的枚举值之一:
SOURCE, //编译器处理完后,并不将它保留到编译后的类文件中
CLASS, //编译器将注解保留在编译后的类文件中,但是在运行时忽略它
RUNTIME //编译器将注解保留在编译后的类文件中,并在第一次加载类时读取它。
如果需要通过反射来获取某个注解类型信息时,此注解类型在定义必须指定Retention为RetentionPolicy.RUNTIME。
3) Document:可以使被修饰的注解在使用到类元素时,会加入到Javadoc中。
a) 定义为Documented的注解必须要设置Retention的值为RetentionPolicy.RUNTIME。
4) 示例: 自定义一个注解类型
@Document
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Dao{
String name();
String value();
}
使用自定义的注解类型
@Dao(name="bookDao", value="com.qiujy.dao.impl.BookDaoOracleImpl")
public class BookService{ ... }
5. 通过反射机制来获取注解类型信息
1) JDK5.0中的java.lang.reflect.AnnotatedElement接口中定义了4个反射性地读取注解信息的方法:
public Annotation getAnnotation(Class annotationType); 如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null
public Annotation[] getAnnotations();返回此元素上存在的所有注解
public Annotation[] getDeclaredAnnotations(); 返回直接存在于此元素上的所有注解
public boolean isAnnotationPresent(Class annotationType); 如果指定类型的注解存在于此元素上,则返回 true,否则返回 false
2) java.lang.Class类和java.lang.reflect包中的Constructor, Field, Method, Package类都实现了
AnnotationElement接口,可以从这些类的实例上分别取得标注于其上的注解及相关信息。
3) 示例:
Annotation anno = BookService.class.getAnnotation(Dao.class);
if(null != anno){
Class clazz = anno.annotationType();
Method method = clazz.getDeclaredMethod("name");
String name = (String)method.invoke(anno);
Method method2 = clazz.getDeclaredMethod("value");
String value = (String)method2.invoke(anno);
...
}
6. 枚举类型: JDK5.0以上版本提供了一种新的数据类型叫枚举,它是引用类型.
1) 定义枚举类型:enum关键字来定义。枚举值用逗号分隔。如
public enum Color{ RED, BLUE, GREENT; }
2) 在枚举类型中也可以定义属性,方法和构造方法(默认就是private的,不能添加其它访问修饰符)。如:
public enum Color{
RED("红色", 1), BLUE("蓝色", 2), GREEN("绿色", 3);
private String name;
private int value;
Color(String name, int value){
this.name = name;
this.value = value;
}
public String toString(){
return this.name;
}
public int getValue(){
return this.value;
}
}
3) 枚举类型就是引用类型,可以用来声明变量和参数。如:private Color eyeColor = Color.BLUE;
取枚举值时直接用枚举类型名.枚举值名,如Color.RED
调用枚举类型中定义的方法:Color.BLUE.toString(); Color.GREEN.getName();
4) JDK1.4之前没有枚举类型时,使用类或接口来定义常量来代表。