元注解:用来修饰注解[java内建或者用户自定义]的“注解”,本身属于注解,可看作是原子注解[原子:最小单位,不可分割]。
java提供了四种元注解:
@Retention:表示需要在什么级别保存该注解信息。取值(RetentionPolicy)包括: SOURCE:在源文件中有效(即源文件保留) CLASS:在class文件中有效(即class保留) RUNTIME:在运行时有效(即运行时保留),因此可以通过反射机制读取注解的信息。
@Target:表示该注解可以用于什么地方。取值(ElementType)包括: CONSTRUCTOR:用于描述构造器 FIELD:用于描述域[字段] LOCAL_VARIABLE:用于描述局部变量 METHOD:用于描述方法 PACKAGE:用于描述包 PARAMETER:用于描述参数 TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Documented:表示将此注解包含在javadoc中。
@Inherited:表示允许子类继承父类中的注解。
此外,java内建[提供,内置]了三种注解:
@Override,表示当前的方法定义将覆盖超类中的方法。 @Deprecated,表示当前方法即将废弃,不推荐使用。 @SuppressWarnings,表示忽略编译器的警告信息。参数-->deprecation:忽略过时 ,rawtypes:忽略类型安全 ,unused:忽略不使用 , unchecked:忽略安全检查,null:忽略空指针,all:忽略所有
如何自定义注解?自定义注解格式:public @interface 注解名 {定义体}
public @interface Annotation1 { 属性1; 属性2; ...... }属性格式:
修饰符 返回值类型 属性名() [default默认值] 修饰符-->默认值public abstract , 且只能是public abstract。 返回值类型-->基本类型、 字符串String、Class、 注解、 枚举, 以及以上类型的一维数组 属性名-->自定义 default默认值-->可以省略注解类中定义的元素称为注解元素[属性],注解元素[属性]可用的类型如下:
所有基本数据类型(int,float,boolean,byte,double,char,long,short) String类型 Class类型[用户自定义或java内置] enum类型[用户自定义或java内置] Annotation类型[用户自定义或java内置] 以上所有类型的数组
当自定义注解类中只有一个属性是,属性名应该为value。因为注解中不允许属性值为null,所以通过设置负数或者空字符串来表示属性值为null。
如果给类、方法等添加注解,如果需要获得注解上设置的数据,那么就必须对注解进行解析,JDK提供了java.lang.reflect.AnnotatedElement接口允许在运行时通过反射获得注解。
boolean isAnnotationPresent(Class annotationClass)当前对象是否有注解 T getAnnotation(Class<T> annotationClass)获得当前对象上指定的注解 Annotation[] getAnnotations()获得当前对象及其从父类上继承的,所有的注解 Annotation[] getDeclaredAnnotations()获得当前对象上所有的注解
自定义注解案例:
package test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
String author() default "Annotationtest" ;
String date();
int revision() default 1 ;
String comments() ;
}
注解解析案例:获取注解类中的的数据信息
package test;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
public class AnnotationExample {
@Override
@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 1)
public String toString() {
return "Overriden toString method";
}
@Deprecated
@MethodInfo(comments = "deprecated method", date = "Nov 17 2012")
public static void oldMethod() {
System.out.println("old method, don't use it.");
}
@SuppressWarnings({ "unchecked", "deprecation" })
@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 10)
public static void genericsTest() throws FileNotFoundException {
List l = new ArrayList();
l.add("abc");
oldMethod();
}
}
package test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationParsing {
public static void main(String[] args) {
try {
for (Method method : AnnotationParsing.class
.getClassLoader()
.loadClass(("test.AnnotationExample"))
.getMethods()) {
// checks if MethodInfo annotation is present for the method
// 检查该方法是否存在MethodInfo注解
if(method.isAnnotationPresent(test.MethodInfo.class)){
try {
// iterates all the annotations available in the method
for (Annotation anno : method.getDeclaredAnnotations()) {
MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
if (methodAnno.revision() == 1) {
System.out.println("Method with revision no 1 = "+ method);
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
注解的一般应用框架设计上,比如通过注解添加标记,使用反射获取相关信息。
java注解xml: java关于xml的注解: JAXB(自动生成xml文件)
java注解入门:java注解入门
Java注解探究:自定义注解封装简易网络请求框架
框架基础:全面解析Java注解