注解

1.什么是注解

注解(Annotation),也叫元数据(描述数据的数据)。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

2. 注解的作用

编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

3.注解的分类

注解大致可以分为两类:

  • JDK自带注解
  • 自定义注解

JDK 8 自带注解一共有四种:
@Override:表示当前的方法定义将覆盖父类的方法。
@Deprecated:若某类或某方法加上该注解之后,表示此类或方法不再建议使用。
@SuppressWarnings:关闭不当的编译器警告信息.
@Repeatable: 重复注解

4.元注解

Java目前内置了四种标准注解,以及四种元注解;元注解就是描述注解的注解。
@Retention
注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:

  • SOURCE:注解仅存在于源码中,在class字节码文件中不包含
  • CLASS:默认的保留策略,注解在class字节码文件中存在,但运行时无法获得
  • RUNTIME:注解在class字节码文件中存在,在运行时可以通过反射获取到

@Inherited
声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解

@Documented
声明注解能够被javadoc等识别

@Target
用来声明注解范围(枚举ElementType),ElementType可选值:

  • TYPE:接口、类、枚举、注解
  • FIELD:字段、枚举的常量
  • METHOD:方法
  • PARAMETER:方法参数
  • CONSTRUCTOR:构造函数
  • LOCAL_VARIABLE:局部变量
  • ANNOTATION_TYPE:注解
  • PACKAGE:包

5.自定义注解

需求:实现实体类、表的映射关系
自定义Table注解:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Inherited
public @interface Table {
    String name();
}

自定义Column注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Column {
    String name();
}

定义实体类User

@Table(name = "t_user")
public class User {

    @Column(name = "user_name")
    private String userName;

    @Column(name = "sex")
    private String sex;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

测试代码

public class UserTest {

    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射,获取字节码对象
        Class<?> clazz = Class.forName("com.huawang.springboot.entity.User");

        StringBuilder sb = new StringBuilder();

        sb.append("select ");

        //获取所有的属性值
        Field[] fields = clazz.getDeclaredFields();
        //获取所有的列名
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            Column column = field.getAnnotation(Column.class);
            sb.append(column.name() + " ");
            if (i == fields.length - 1) {
                sb.append(" from ");
            } else {
                sb.append(",");
            }
        }
        //获取表名
        Table table = clazz.getAnnotation(Table.class);
        sb.append(table.name());
        System.out.println(sb.toString());
    }
}

输出结果
结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值