注解概念:
Java 注解(Annotation),是 JDK5.0 引入的一种注释机制。Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。注解可以被看作是对一个类/方法的一个扩展的模版,按照注解类中的规则,处理不同的逻辑。
注解的作用:
Java 注解使本来可能需要很多配置文件,需要很多逻辑才能实现的内容,可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰。Java 注解在框架代码如Spring boot中得到了广泛的应用。
最常用的3种注释为:
元注解
有童鞋会问,Deprecated是注解,怎么它的上方还有注解?@Retention,@Target是什么鬼?@Retention,@Target都被称为元注解,元注解顾名思义我们可以理解为注解的注解,它是作用在注解中,方便我们使用注解实现想要的功能。元注解分别有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五种。
@Retention
@Target
@Documented
@Inherited
@Repeatable
注解属性
注解只有成员变量,没有方法。以下我们定义了一个方法注解,作用在方法上,有name和age两种属性。
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String name() default "sheldon"; int age(); }
对注解中的属性赋值,因为name已经赋予了默认值sheldon,因此只需再给age赋值即可,如下。
public class Student { @MyAnnotation(age = 26) public void test() { } }
获取注解属性
获取注解属性是使用注解的关键,获取注解属性的方法都是基于反射。
public class AnnotationTest { public static void main(String[] args) throws Exception { Class<?> studentClass = Student.class; Method method = studentClass.getMethod("test"); //判断test()方法上是否存在@MyAnnotation注解 boolean isPresent = method.isAnnotationPresent(MyAnnotation.class); if (isPresent) { //如果存在,打印出注解中的属性值 MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); System.out.println(annotation.name()); System.out.println(annotation.age()); } } }
输出
sheldon
26
应用 - 进行逻辑判断
既然能够获取到注解的属性值,那我们便可以进行逻辑判断。下面我们看一个银行转账的例子,假设银行有个转账业务,转账的限额可能会根据汇率的变化而变化,我们可以利用注解灵活配置转账的限额,而不用每次都去修改我们的业务代码。
/**定义限额注解*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface BankTransferMoney { double maxMoney() default 10000; }
/**转账处理业务类*/
public class BankService {
/**
* @param money 转账金额
*/
@BankTransferMoney(maxMoney = 15000)
public static void TransferMoney(double money){
System.out.println(processAnnotationMoney(money));
}
private static String processAnnotationMoney(double money) {
try {
Method transferMoney = BankService.class.getDeclaredMethod("TransferMoney",double.class);
boolean annotationPresent = transferMoney.isAnnotationPresent(BankTransferMoney.class);
if(annotationPresent){
BankTransferMoney annotation = transferMoney.getAnnotation(BankTransferMoney.class);
double maxMoney = annotation.maxMoney();
if(money > maxMoney){
return "转账金额大于限额,转账失败";
}else {
return"转账金额为:"+money+",转账成功";
}
}
} catch ( NoSuchMethodException e) {
e.printStackTrace();
}
return "转账处理失败";
}
public static void main(String[] args){
TransferMoney(10000);
}
}
输出
转账金额为: 10000.0,转账成功
原文:https://www.cnblogs.com/jelly12345/p/15054595.html