java注解

元注解:用来修饰注解[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注解



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值