
Java自定义注解-总结
生成文档:通过注解提供的元信息生成Javadoc。 编译检查:编译器可以根据注解检查代码是否符合规范。 动态处理:在编译或运行时根据注解进行动态处理。 反射获取:在运行时通过反射获取注解信息。 1.
2.
3.
4.
5.
发布日期: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新增)
注解的作用
注解的主要作用包括:
元注解的详细说明
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框架的实现。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月13日 04时06分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java中Object.equals()简单用法
2019-03-06
一个小例子对多态简单的理解
2019-03-06
poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)
2019-03-06
poj 2492A Bug's Life(并查集)
2019-03-06
ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
2019-03-06
java中自动装箱的问题
2019-03-06
zyUpload+struct2完成文件上传
2019-03-06
knockout+echarts实现图表展示
2019-03-06