----------------------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培训、期待与您交流! ----------------------