反射中的Annotation注解

Annotation注解

Annotation注解,也翻译为注释,但是他与之前学过的注释不一样,它是代码中的特殊标记,这些标记是可以在编译、类加载、运行时被读取,并且执行相应的处理,他可用于类、构造方法、成员变量、方法、参数等声明中。
可以分为内置注解和自定义注解

内置注解

@Override:限定重写父类的方法
@Deprecated:表示已过时
@SupressWarnings:抑制编译器报告警告

自定义注解

常用的元注解
(1)@Decumented:指示某一类型的注释通过javadoc和类似的默认工具进行文档化
(2)@Inherited:指示注释类型被自动继承
(3)@Retention:指示注释类型的注释要保留多久
(4)@Target:指示注释类型所适用的程序元素的种类

上述四个元注解会经常用到@Target和@Retention
@Target通过ElementType枚举来设置
ANNOTTION_TYPE :表示Annotation类型
TYPE :表示用于类、接口、枚举、Annotation类型
CONSTRUCTOR:表示用于构造方法
FIELD:表示用于成员变量和枚举变量
METHOD:表示用于方法
PARAMETER :表示用于参数
LOCAL_VARIABLE:表示用于局部变量
PACKAGE:用于包
@Retention通过RetentionPlicy枚举来设置
SOURCE:表示不编译到class文件中
CLASS:表示编译到class文件中
RUNTIEM:表示加载到JVM中

案例

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Price {
	double value() default 0.0;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Address {
	String value() default "";
	String name() default "";
}
public class Watermelon {
	@Address(name = "好西瓜")
	private String name;
	@Address("日本北海道")
	private String address;
	@Price(23.6)
	private double price;
	@Override
	public String toString() {
		return "Watermetlon [address=" + address + ", name=" + name
				+ ", price=" + price + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
}

public class TestWatermelon {
	public static void main(String[] args) {
		Watermelon watermelon = new Watermelon();
		Class waClass = watermelon.getClass();//获得watermeton class
		//获得全部属性包括注解
		Field[] fields = waClass.getDeclaredFields();
		for(Field field : fields){
			if(field.isAnnotationPresent(Address.class)){//判断该注解是否在该字段上
				Address address = field.getAnnotation(Address.class);//获得该注释上的注解
				if("address".equals(field.getName())){
					watermelon.setAddress(address.value());
				}else if("name".equals(field.getName())){
					watermelon.setName(address.name());
				}
			}else if(field.isAnnotationPresent(Price.class)){
				Price price = field.getAnnotation(Price.class);
				watermelon.setPrice(price.value());
			}
		}
		System.out.println(watermelon);
	}
}

运行结果:

Watermetlon [address=日本北海道, name=好西瓜, price=23.6]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值