常见注解
JDK自带注解
1.@Override 表示一个方法覆盖了父类的方法,若父类中没有同名同参方法,使用该注解会报错。
2.@Deprecated 表示一个方法已过期,不推荐使用该注解
3.@Suppvisewarnings 表示关闭一些警告信息,如@Suppvisewarnings("deprecation") 表示忽略过期方法的提示
Spring注解
1.@Component 加在类声明上,表示一个类作为bean加载到spring容器中
2.@Autowired 加载一个属性上,表示为该属性自动装配一个对象。
Mybatis注解
1.@InsertProvider
2.@UpdateProvider
3.@Options
注解分类
按照运行机制
- 源码注解 注解只在源码中存在,编译成.class文件就不存在了
- 编译时注解 注解在源码和.class文件都存在
- 运行时注解 注解在运行时仍起重要作用
按照来源分类
- JDK自带注解
- 框架注解
- 自定义注解
元注解 :注解的注解
java中有四个元注解
元注解 | 描述 |
@Target | 表示该注解可以用于什么地方。可能的ElementType参数包括: CONSTRUCTOR:构造器的生命 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类型)和enum声明 ANNOTATION_TYPE:注解声明(与TYPE的区别?专门用在注解上的TYPE) TYPE_PARAMETER:Java8 TYPE_USE:Java8 |
@Retention | 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括: SOURCE:注解将在编译器丢弃 CLASS:注解在class文件中可用,但会被VM丢弃 RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息 |
@Inherited | 允许子类继承父类中的注解 |
@Documented | 生成Javadoc时会包含此注解信息 |
自定义注解
自定义注解要求:
- 必须以@interface声明为注解
- 成员变量需以无参无异常方法格式声明
- 只有一个成员变量时,规定使用value作为名称
- 使用元注解限制其属性
@Documented //元注解
@Inherited
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
String value();
String author();
String key() default "";
}
使用注解举例
@Description(value="test value",author = "wang")
public String desc(){
return "hello this is desc";
}
通过反射使用注解
@Documented //元注解
@Inherited
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
String desc();
String author() default "wang";
String key() default "";
}
public class Person {
public Person(){}
@Description(desc = "这是name") //author--"wang" key--""
private String name;
@Description(desc = "这是年龄") //author--"wang" key--""
private int age;
//忽略getter and setter ....
}
public class MyAnnoDemo {
public static void main(String[] args) {
Class personClass = Person.class;
Field[] fields = personClass.getDeclaredFields(); //获取类的所有属性
for(Field field :fields){
String fieldName = field.getName(); //获取属性名称
if(field.isAnnotationPresent(Description.class)){ //如果存在Description注解
Description personDesc = field.getAnnotation(Description.class);
String desc = "字段描述:" + personDesc.desc() + ";创建人:" + personDesc.author();
System.out.println("属性-"+ fieldName + "的描述信息是:" + desc);
}
}
}
}