java---Annotation

package senssic.demo;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * jdk1.5后增加的新特性,使用注释的方式加入一些程序信息,java.lang.
 * java.lang.annotation.Annotation接口是所有Annotation必须实现的接口,默认的隐式实现,可以被类或抽象类实现可以被继承,但本身不能继承其他接口
 */
enum MyEnum {
	大一, 大二, 大三, 大四;
}

/**
 * 自定义annotation
 */
// 使用Retention定义一个Annotaion保存的范围,其中有个RetentionPolicy枚举表示保存的范围,
// SOURCE:此Annotaion类型的信息只会保留在源程序文件中.java
// CLASS:此Annotation类型的信息会保留在.java和.class文件中,但不会被加载到虚拟机中,如果annotation没有声明指定范围则默认此范围
// RUNTIME|:此Annotaion类型信息会保留在.java和.class文件以及虚拟机(jvm)中,一直会在执行时候起作用
@Retention(RetentionPolicy.RUNTIME)
// 使用Target指明此annotation的使用地方,使用的是ElementType枚举
// ANNOTATION_TYPE:使用在annotation上
// CONSTRUCTOR:使用在构造方法上
// FIELD:使用在字段上(包括枚举常量)
// LOCAL_VARIABLE:使用在局部变量上
// METHOD:使用在方法上
// PACKAGE:使用在包上
// PARAMETER:使用在参数上
// TYPE: 使用在类、接口(包括注释类型)或枚举声明上
@Target(value = { ElementType.TYPE, ElementType.METHOD })
@interface MyAnnotation {//方法必须是无参且不抛异常,返回值只能是原始类型,Class类型,枚举类型,不能是除此之外的其他数据引用
	public String name();

	public int age() default 20;// 可以设置默认值,但默认值不能为null

	public String[] location();// 可以是数组

	public MyEnum myEnum();// 可以是枚举
}

class A {

	public void p() {
		System.out.println("父类A的方法!");
	}

	public <T> void pp(T t) {
		System.out.println("泛型:" + t);
	}

}

/**
 * 系统内建的Annotation:@Override:表示覆写的正确性@Deprecated:表示本身不建议使用的操作@SuppressWarnings
 * :用于压制警告信息,即不再显示警告编译
 */
@MyAnnotation(location = { "池州", "阜阳" }, myEnum = MyEnum.大三, name = "senssic")
class B extends A {
	// 此方法将无安全警告(此处为泛型安全警告)
	@SuppressWarnings("rawtypes")
	// 此方法不建议使用
	@Deprecated
	// 此方法为覆写
	@Override
	@MyAnnotation(location = { "中国", "安徽" }, myEnum = MyEnum.大四, name = "qiyu")
	public void p() {
		ArrayList aList = new ArrayList();
	}
}

public class AnnotationClass {
	/**
	 * Annotation工作原理:解析annotation---通过反射获取Annotation(
	 * 此时Annotation必须是RUNTIME范围的annotation)
	 * 的相应信息,相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素,
	 * 或改变他们的行为,annotation不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// 使用反射获得类上的Annotation,反射只能得到范围是RUNTIME的annotation,如果想操作其他范围内的可以使用apt
		Class c = null;
		try {
			c = Class.forName("senssic.demo.B");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("类上的Annotation");
		for (Annotation ann : c.getAnnotations()) {
			System.out.println(ann.toString());
		}
		Method method = c.getMethod("p");
		System.out.println("方法上的Annotation");
		for (Annotation ann : method.getAnnotations()) {
			System.out.println(ann.toString());
		}

	}
}

运行结果:

类上的Annotation
@senssic.demo.MyAnnotation(age=20, location=[池州, 阜阳], myEnum=大三, name=senssic)
方法上的Annotation
@java.lang.Deprecated()
@senssic.demo.MyAnnotation(age=20, location=[中国, 安徽], myEnum=大四, name=qiyu)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值