一文读懂Java注解
2021-01-14 18:13
标签:匿名函数 影响 warnings 产生 cto interface tab time 元数据 Java官方文档上说,注解是元数据的一种形式,它提供不属于程序一部分的数据,注解对被注解的代码没有直接的影响。 准确上说,注解只不过是一种特殊的注释而已,如果没有解析它的代码,它可能连注释都不如。 注解有很多种用途,其中包括: 编译器可以使用这些注解来检查错误或者禁止显示告警,如 @Override、@Deprecated、@SuppressWarnings 可以通过注解信息生产相关代码,如lombok的 @Data、@ToString等注解 在运行时处理的逻辑,如常用的Spring框架中的 @Service、@Component、@SpringBootApplication等注解 Java一开始有定义了一套注解,共8个,3个在java.lang中,剩下4个在java.lang.annotation中 其中,作用于代码的注解有 作用在其他注解的注解(或者说是元注解)有 @Retention - 注解的声明周期,标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 value为RetentionPolicy类型,有以下三种 @Target - 注解的作用目标,标记这个注解应该是哪种 Java 成员。 value为ElementType数组,ElementType类型如下 @Inherited - 阐述了某个被标注的类型是被继承的。 @Documented - 标记这些注解是否包含在用户文档中。 从java7开始,又额外添加了3个注解 自定义注解,是使用注解 元数据 来实现的,和java内置注解一样,是使用 @interface 关键字来声明的。 定义注解格式 如: 参数只有public或默认(default)这两个访问修饰符,例如 String value() 这里把方法设为 default 类型 注解参数可支持的数据类型有: 所有基本数据类型(int,float,boolean,byte,double,char,long,short) String类型 Class类型 enum类型 Annotation类型 以上所有类型的数组 其中当value属性存在的时候,且只写value属性是,可以省略value,如spring的 @Component 注解: 使用的时候可以是 @Component、@Component("jfound")、@Component(value="jfound"); 通过过反射是可以获取相应的注解的,然后获取注解后根据注解或者注解里面的属性来进一步逻辑处理。 如Class类中提供了以下一些方法用于反射注解: 相应的,Field、Method等类也有同样的方法来反射注解 输出 上面的例子至少个简单的注解使用,注解使用的场景还是比较多的,如一开始的用途例子中的lombok用于代码生成,spring中的@Component用于bean的生产,jpa中的@Table 用于数据表的识别等等。 一文读懂Java注解 标签:匿名函数 影响 warnings 产生 cto interface tab time 元数据 原文地址:https://www.cnblogs.com/jfound/p/12940503.html什么是注解
主要用途
Java 内置的注解
自定义注解
public @interface 注解名 {定义体}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DemoAnnotation {
String value(); //public 关键字可以去掉,默认是public的
String name() default "write";
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}
注解与反射
注解使用案例
package jfound;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface CustomName {
String value();
}
package jfound;
@CustomName("person")
public class Person {
@CustomName("user_name")
private String userName;
@CustomName("gender")
private String sex;
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
}
package jfound;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class AnnotationDemo {
public static void main(String[] args) throws Exception {
Person person = new Person();
person.setUserName("JFound");
person.setSex("boy");
String personKeyName = "";
CustomName annotation = Person.class.getAnnotation(CustomName.class);
if (annotation != null) {
personKeyName = annotation.value();
}
Map
person key name:person
key:gender value:boy
key:user_name value:JFound
总结
上一篇:#0014. 划分数组3
下一篇:Java基础知识_2