注解

2021-04-04  本文已影响0人  sundern

Java注解

第三方注解

按运行机制分

按来源分

自定义注解

  1. 语法:
@Target({ElementType.METHOD,ElementType.TYPE})
@Rentention(RententionPolicy.RUNTIME)
@Inherited
@Document
public @interface Discription{
  String desc();
  String author();
  int age() default 18;
}
  1. 元注解
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE //局部变量
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE //类,接口
RententionPolicy.SOURCE // 源码
RententionPolicy.CLASS // 编译
RententionPolicy.RUNTIME //运行
  1. 使用注解
@Discription(desc="我是一段描述",author="yujian",age=18)
public String getMyName(){
  return "yujian";
}
  1. 解析注解
    通过反射获取类运行时注解信息,从而动态控制类的运行逻辑。

实战

自定义table和column注解映射字段和表,查询数据,打印书SQL
table和column注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}

User类使用table和column注解

@Table("user")
public class User {

    @Column("id")
    private String id;

    @Column("name")
    private String name;

    @Column("email")
    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

根据注解获取标名和字段名,根据反射获取字段值:

        //获取class
        Class c = user.getClass();
        //获取table名称
        if (!c.isAnnotationPresent(Table.class)){
            return null;
        }
        Table table = (Table) c.getAnnotation(Table.class);
        System.out.println(table.value());
        //获取field名称
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields){
            if (field.isAnnotationPresent(Column.class)){
                Column column = field.getAnnotation(Column.class);
                System.out.print(column.value() + ":");
                //通过反射获取对象值
                String fieldName = field.getName();
                String methodName = "get"
                        + fieldName.substring(0,1).toUpperCase()
                        + fieldName.substring(1);
                try {
                    Method method = c.getMethod(methodName);
                    System.out.println(method.invoke(user));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

常见概念

//@Component注解。basePackages定义扫描的包
@ComponentScan(basePackages = { ” com.springboot . chapter3 . pojo” })
//basePackageClasses 定义扫描的类
@ComponentScan(basePackageClasses = {User. class} ) 
//还有 includeFilters 和 excludeFilters 
@ComponentScan(basePackages = "com.springboot.chapter3 . * ”, excludeFilters = {@Filter(classes = {Service . class})}) 。
上一篇 下一篇

猜你喜欢

热点阅读