----------------------java学习型技术博客、期待与您交流!! ----------------------
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。
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) 示例:
下面我们给出一个注解的使用例子
package Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AShow {//声明一个注解
boolean value();//注解的成员可以是多个
}
以上就是一个自定义的注解类
我们再来定义一个使用这个注解的类
package Annotation;
public class Student {
@AShow(value=false)
public void show1(){
System.out.println("aaaa");
}
@AShow(value=true)
public void show2(int i){
System.out.println("bbbb");
}
}
这是一个学生类,只有show1和show2两个方法,都应用了注解
那么由于前面注解类定义时我们使用了这样的声明
@Retention(RetentionPolicy.RUNTIME)
所以这个注解我们可以通过反射机制访问到
下面我们来试一下这个测试类
package Annotation;
import java.lang.reflect.Method;
public class StuAshowTest {
public static void main(String[] args) {
Student student=new Student();
Class stu=student.getClass();
Method [] methods=stu.getMethods();
for(Method method:methods){
AShow a=method.getAnnotation(AShow.class);
if(a!=null){
System.out.print(method.getName()+"的注解值为:");
System.out.println(a.value());
if(a.value()){
System.out.println("输出前需要打开连接");
}else{
System.out.println("输出前需要记录文件");
}
}
}
}
}
结果
show1的注解值为:false
输出前需要记录文件
show2的注解值为:true
输出前需要打开连接
输出前需要记录文件
---------------------- android培训、java培训、期待与您交流! ----------------------