标签:list des 表头 字段名 场景 source 提示 对象类型 示例
Annotation是从JDK5.0开始引入的新技术。
Annotation的作用:
Annotation的格式:
Annotation在哪里使用?
Target
用于指定被修饰的注解修饰哪些程序单元,也就是上面说的类,方法,字段
Retention
用于指定被修饰的注解被保留多长时间,分别
三种类型,如果想要在程序运行过程中通过反射来获取注解的信息需要将Retention设置为RUNTIME
Documented
用于指定被修饰的注解类将被javadoc工具提取成文档
Inherited
用于指定被修饰的注解类将具有继承性
编译器的信息
使用注解,编译器可以检测错误或抑制警告
生成文档
Swagger中就是通过注解对接口,实体类中的字段进行描述生成可视化的文档
代替配置文件
Spring中Bean的装载注入
导出数据
可以写一个统一的导出工具类,传入一个List<实体类>进去即可导出Excel文件,Excel的表头可以用注解加载字段上
框架层面的统一处理
注解在底层框架中用的比较多,在框架中需要考虑到通用性,能用注解做很多事情,比如对API进行权限控制,限流等操作都可以通过自定义注解来标识是否需要进行认证,限流等,还有数据的缓存,典型的就是@Cacheable,还有异步方法的调用@Async,ORM框架中的使用,可以用注解标识表名,字段名,JPA中,Spring Data框架中都有使用
返回类型必须是基本类型,String
,Class
,Enum
或数组类型
之一。否则,编译器将抛出错误。
这是一个成功遵循此原则的示例代码:
enum Complexity {
LOW, HIGH
}
public @interface ComplexAnnotation {
Class<? extends Object> value();
int[] types();
Complexity complexity();
}
下一个示例将无法编译,因为Object不是有效的返回类型:
public @interface FailingAnnotation {
Object complexity();
}
注解可以应用于整个源代码的多个位置。它们可以应用于类,构造函数和字段的声明:
@SimpleAnnotation
public class Apply {
@SimpleAnnotation
private String aField;
@SimpleAnnotation
public Apply() {
// ...
}
}
方法及其参数:
@SimpleAnnotation
public void aMethod(@SimpleAnnotation String param) {
// ...
}
局部变量,包括循环和资源变量:
@SimpleAnnotation
int i = 10;
for (@SimpleAnnotation int j = 0; j < i; j++) {
// ...
}
try (@SimpleAnnotation FileWriter writer = getWriter()) {
// ...
} catch (Exception ex) {
// ...
}
其他注解类型:
@SimpleAnnotation
public @interface ComplexAnnotation {
// ...
}
甚至包,通过package-info.java文件:
@PackageAnnotation
package com.baeldung.interview.annotations;
从Java 8开始,它们也可以应用于类型的使用。为此,注解必须指定值为ElementType.USE的@Target注解:
@Target(ElementType.TYPE_USE)
public @interface SimpleAnnotation {
// ...
}
现在,注解可以应用于类实例创建:
new @SimpleAnnotation Apply();
类型转换:
aString = (@SimpleAnnotation String) something;
接口中:
public class SimpleList<T>
implements @SimpleAnnotation List<@SimpleAnnotation T> {
// ...
}
抛出异常上:
void aMethod() throws @SimpleAnnotation Exception {
// ...
}
有,@ Target注解可用于此目的。如果我们尝试在不适用的上下文中使用注解,编译器将发出错误。
以下是仅将@SimpleAnnotation批注的用法限制为字段声明的示例:
@Target(ElementType.FIELD)
public @interface SimpleAnnotation {
// ...
}
如果我们想让它适用于更多的上下文,我们可以传递多个常量:
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE })
我们甚至可以制作一个注解,因此它不能用于注解任何东西。当声明的类型仅用作复杂注解中的成员类型时,这可能会派上用场:
@Target({})
public @interface NoTargetAnnotation {
// ...
}
注解总是扩展java.lang.annotation.Annotation,如Java语言规范中所述。
如果我们尝试在注解声明中使用extends子句,我们将得到一个编译错误:
public @interface AnAnnotation extends OtherAnnotation {
// Compilation error
}
这些是可以多次应用于同一元素声明的注解。
出于兼容性原因,由于此功能是在Java 8中引入的,因此重复注解存储在由Java编译器自动生成的容器注解中。对于编译器来说,执行此操作有两个步骤。
首先,我们需要声明一个可重复的注解:
@Repeatable(Schedules.class)
public @interface Schedule {
String time() default "morning";
}
然后,我们使用强制值元素定义包含注解,其类型必须是可重复注解类型的数组:
public @interface Schedules {
Schedule[] value();
}
现在,我们可以多次使用@Schedule:
@Schedule
@Schedule(time = "afternoon")
@Schedule(time = "night")
void scheduledMethod() {
// ...
}
您可以使用Reflection API或注解处理器来检索注解。
该@Retention注解和其的RetentionPolicy参数会影响您检索它们。RetentionPolicy枚举中有三个常量:
以下是创建可在运行时读取的注解的示例代码:
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
String value();
}
现在,可以通过反射检索注解:
Description description
= AnnotatedClass.class.getAnnotation(Description.class);
System.out.println(description.value());
注解处理器可以使用RetentionPolicy.SOURCE
当您编写Java字节码解析器时,RetentionPolicy.CLASS可用。
优点
缺点
标签:list des 表头 字段名 场景 source 提示 对象类型 示例
原文地址:https://www.cnblogs.com/sweetorangezzz/p/13096698.html