Java自定义注解-总结
发布日期:2021-05-07 23:39:05 浏览次数:20 分类:精选文章

本文共 2984 字,大约阅读时间需要 9 分钟。

Java自定义注解

什么是注解?

Java 1.5引入了注解(Annotation)的概念。注解可以看作是代码级别的插件,用于在代码中标注特定的信息。注解不会影响代码的逻辑执行,但可以帮助开发者更好地理解代码、生成文档或进行代码验证。

注解可以分为以下几类:

1. 元注解

元注解用于定义注解本身的属性,常见的元注解包括:

  • @Retention: 表示注解的保留级别,默认为RetentionPolicy.RUNTIME
  • @Target: 指定注解作用的目标元素类型,如类、方法、字段等。
  • @Documented: 表示注解相关信息会被包含在Javadoc中。
  • @Inherited: 表示该注解可以被子类继承。
  • @Repeatable: 表示注解可以多次作用于同一个元素。

2. JDK自带的标准注解

JDK提供了一些常用的注解,如:

  • @Override: 表示重写父类方法。
  • @Deprecated: 表示该类已被废弃。
  • @SuppressWarnings: 忽略编译器警告。

3. 自定义注解

开发者可以根据需求定义自己的注解,常见的用途包括:

  • 代码文档生成。
  • 编译期或运行期的代码检查。
  • 动态处理或反射获取。

Java注解的架构

注解在Java中是一个接口,所有注解都继承自Annotation接口。每个注解都与一个RetentionPolicy关联,指定注解的保留级别。同时,注解可以关联多个ElementType,指定注解作用的目标元素类型。

注解的实现类包括:

  • Deprecated
  • Documented
  • Inherited
  • Override
  • Repeatable(JDK 1.8新增)

注解的作用

注解的主要作用包括:

  • 生成文档:通过注解提供的元信息生成Javadoc。
  • 编译检查:编译器可以根据注解检查代码是否符合规范。
  • 动态处理:在编译或运行时根据注解进行动态处理。
  • 反射获取:在运行时通过反射获取注解信息。
  • 元注解的详细说明

    1. @Retention

    指定注解的保留级别:

    • SOURCE: 只在源码中保留,不生成字节码。
    • CLASS: 在字节码中保留,但无法在运行时获取。
    • RUNTIME: 在字节码和运行时都保留,适用于自定义注解。

    2. @Target

    指定注解作用的元素类型,常见类型包括:

    • TYPE: 类、接口、枚举。
    • METHOD: 方法。
    • FIELD: 字段。
    • PARAMETER: 方法参数。
    • CONSTRUCTOR: 构造函数。
    • LOCAL_VARIABLE: 局部变量。
    • ANNOTATION_TYPE: 注解类型。
    • PACKAGE: 包。
    • TYPE_PARAMETER: 类型泛型。
    • TYPE_USE: 类型使用(JDK 1.8新增)。

    3. @Documented

    将注解信息包含在Javadoc中,便于生成文档。

    4. @Inherited

    允许注解被子类继承。

    5. @Repeatable

    允许注解多次作用于同一个元素,每次作用可以有不同的含义。

    注解的本质

    注解本质上是一个接口,所有注解都继承自Annotation接口。注解的属性通过接口的方法实现,例如:

    public @interface MyAnnotation {    String value();}

    开发者可以通过反射机制获取注解信息,并根据其属性进行动态处理。

    自定义注解实现ORM框架映射

    自定义表映射注解

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

    自定义字段属性

    @Retention(RetentionPolicy.RUNTIME)public @interface SetProperty {    String name();    int leng();}

    实体类实现

    @SetTable(value = "student_info")class User {    @SetProperty(value = "student_id", leng = 10)    private String id;        @SetProperty(value = "student_name", leng = 25)    private String name;        // getter 和 setter 方法...}

    测试实现

    public class Test002 {    public static void main(String[] args) throws ClassNotFoundException {        Class
    userClass = Class.forName("com.entity.User"); // 获取类注解 SetTable tableAnnota = userClass.getDeclaredAnnotation(SetTable.class); String tableName = tableAnnota.value(); // 获取字段注解 StringBuffer sql = new StringBuffer(); sql.append("select "); Field[] declaredFields = userClass.getDeclaredFields(); for (int i = 0; i < declaredFields.length; i++) { Field field = declaredFields[i]; SetProperty propertyAnnota = field.getDeclaredAnnotation(SetProperty.class); if (propertyAnnota != null) { sql.append(" ").append(propertyAnnota.value()); if (i < declaredFields.length - 1) { sql.append(", "); } } } sql.append(" from ").append(tableName).append(";"); System.out.println(sql.toString()); }}

    输出结果:

    select student_id, student_name from student_info;

    通过自定义注解,我们可以将数据库表结构和字段信息映射到Java实体类中,从而简化ORM框架的实现。

    上一篇:23种设计模式-总结
    下一篇:JAVA必备知识点面试题

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月13日 04时06分52秒