Java 注解及自定义注解处理器

Android进阶——关于自定义注解Annotation和注解处理器APT的那一些你应该掌握的造轮子必备知识点 关于注解和注解处理器的那些事 阅读详情

注解介绍

注解,也被称为元数据(所谓的元数据,就是描述数据的数据)。 
所以注解的主要作用就是给指定代码一些描述信息。这些指定代码可以是一个类、一个方法或者是一个属性。

Java注解是在Java SE5中被引入进来的,在Java中内置了三种注解以及四种元注解。

内置注解

内置注解说明
@Override表示当前的方法定义将覆盖超类中的方法,如果方法名或者参数有误,那么编译器就会报错提示。
@Deprecated用于注解已经过时的代码(方法或者某属性),使用了该注解的方法或者属性编译器会发出警告
@SuppressWarnings关闭不当的编译器警告信息。如果一个方法调用的方法已过时,或使一个不安全的类型转换,编译器可能会产生一个警告。您可以通过包含使用@SuppressWarnings注解代码的方法标注抑制这些警告。

元注解

在Java中提供了四种元注解,这四个注解的主要作用就是用于注解其他注解。

元注解说明
@Target指定注解的作用域
@Retention指定在那个级别保存该注解信息。
@Documented指定这个注解的元素可以被javadoc此类的工具文档化
@Inherite指定该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类

@Target

@Target:指定注解的作用域,由ElementType枚举指定定义。 
该注解的源码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

ElementType源代码如下:

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

    TYPE_PARAMETER,// java8声明
    TYPE_USE// java8声明
}

@Retention

@Retention:指定在那个级别保存该注解信息,由RetentionPolicy枚举定义。该注解的源码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}

RetentionPolicy源码如下:

public enum RetentionPolicy {
    SOURCE,//仅仅在源代码中可以使用,可以被编译器识别

    CLASS,//在源代码、class文件中可用,不能再runtime中使用,默认就是这个策略

    RUNTIME //在源代码、class、runtime中都可以使用
}

自定义注解

在自定义注解时,我们需要使用上面提到的元注解,通过元注解自定义注解。

下面定义一个注解类@UseCase:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    // 注解的元素
    public int id();
    // 为注解的元素设置默认值
    public String description() default "no description";
}

在注解@UseCase中,这里为该注解定义了两个元素,分别是id和description,同时为元素description设置了默认值”no description”。

在给注解的元素指定具体值时,主要是通过键值对的形式赋值。如下所示:

private class PasswordUtils {
    @UseCase(id = 47, description =
            "Passwords must contain at least one numeric")
    public boolean validatePassword(String password) {
        return (password.matches("\\w*\\d\\w*"));
    }

    @UseCase(id = 48)
    public String encryptPassword(String password) {
        return new StringBuilder(password).reverse().toString();
    }
} 

注解元素

在为注解类定义元素时,注解的元素只能是以下类型,否则编译器会报错:

  • 八大基本类型(int、short、long、float、double、boolean、char、byte)
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

注解的元素定义如下,如同普通接口中的方法定义,与普通方法不同的是注解的元素可以设置默认值。

类型 参数名() default 默认值

其中默认值是可选的,可以定义, 也可以不定义。

如果定义的注解中不存在元素,那么这样的注解被称为标记注解。

注解元素必须要有确定的值,要么定义默认值,要么在使用时赋值。对于引用类型,绝对不能出现null的存在。所以在判断元素存在或缺失时可以通过负数、空字符串设定。

如果注解的元素命名为value,并且是唯一需要赋值的元素,那么可以通过快捷方式赋值,即@UseCase(100)

通过反射实现注解处理器

在上面主要介绍了注解和自定义注解相关的知识点。对于注解,如果没有通过注解处理器来对注解进行处理,那么注解的作用和注释就没有什么区别了。

所以这里主要总结两种常见的实现java注解处理器的方式:

  • 通过反射实现的运行时注解处理器
  • 通过apt工具实现的编译时注解处理器

AnnotatedElement接口

AnnotatedElement,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:

  • AccessibleObject,
  • Class,
  • Constructor,
  • Field,
  • Method,
  • Package

通过这些实现类不难知道,AnnotatedElement可以通过反射获取。

在AnnotatedElement中主要定义了四个方法,如下:

接口方法说明
< T extends Annotation> T 
getAnnotation(Class annotationClass)
获取元素上指定类型的注解,如果存在则返回null
Annotation[] 
getAnnotations()
返回元素上存在的所有注释
Annotation[] 
getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释
boolean 
isAnnotationPresent(Class annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false

通过反射实现注解处理器

这里通过注解,实现一个简单的Android依赖注入的功能。

首先,定义一个注解@BindView

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView {

    int value();
}

这里需要注意,如果自定义注解需要在运行时使用反射来处理时,那么该注解的@Retention注解一定要是RetentionPolicy.RUNTIME,因为反射是在JVM运行时来进行处理的。

然后开始实现一个注解处理器,代码如下:

public class InjectUtils {

    public static void inject(Activity activity) {
        //1、 获取指定类上申明的所有字段
        Field[] declaredFields = activity.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            // 2、获取每次字段中包含BindView注解的字段。
            BindView annotation = field.getAnnotation(BindView.class);

            if (annotation != null) {
                // 3、通过获取注解指定的value,初始化View
                int value = annotation.value();
                View view = activity.findViewById(value);
                try {
                    field.set(activity, view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

在具体activity中使用如下:

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.textView)
    TextView textView;
    @BindView(R.id.button)
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InjectUtils.inject(this);

        textView.setText("text通过注解初始化并设置值");

        button.setBackgroundColor(Color.RED);
        button.setText("button通过注解实现了初始化");

    }
}

通过反射实现注解处理器的大概过程基本如上,这里使用反射都是在JVM运行时实现的,这样在JVM运行时通过反射实现注解处理器的方式在一定成都上会对性能造成一定的影响。所以,在日常开发中很少会使用这样的方式。

我们更加关注的是如何通过apt工具实现注解处理器,这个将在下一个章节具体说明。

这里写图片描述

源自:https://blog.youkuaiyun.com/kaifa1321/article/details/79622715

Java注解与自定义注解处理器 所以本文就注解与自定义的注解处理器来学习注解。 阅读详情

相关推荐

Java注解处理器:自定义注解的编译期处理深度解析

本文全面介绍了Java注解处理器的工作原理与实现方法。注解处理器是Javac组件,可在编译期处理注解并生成代码,相比反射处理具有无运行时开销、编译时报错等优势。文章详细阐述了开发步骤:定义注解、实现AbstractProcessor、配置处理器,并提供了Builder模式生成的完整代码示例。注解处理器能自动生成源代码,如文中的Builder类,极大提升开发效率。其核心价值在于编译期代码生成和验证,适用于框架开发、代码生成等场景。

记录学习的过程 1385

使用Java的注解实现自定义注解和注解处理器

在实际应用中,可以根据需求扩展和定制注解和注解处理器的功能,并根据具体的业务逻辑进行相应的处理操作。请注意,注解处理器的使用和配置可能会因编译器和开发环境而有所不同,请根据具体情况进行相应的调整和配置。使用Java的注解可以实现自定义注解和注解处理器,注解处理器可以在编译时或运行时处理注解,并根据注解信息进行相应的逻辑处理。- 在 `process()` 方法中获取被注解标记的元素,并根据注解信息进行相应的处理逻辑。- 可以使用元注解对注解进行更多的配置,如指定注解的生命周期、可重复性等。

m0_75198698的博客 846

从零到一:3D Slicer与MONAI在医学影像中的AI革命

本文探讨了3D Slicer与MONAI在医学影像分析中的革命性应用,展示了如何通过开源工具实现高效的三维影像处理和AI增强分析。结合临床案例,详细介绍了从数据准备到AI分析的全流程,显著提升诊断效率和精度,推动医学影像技术迈向新纪元。

tcp8optimizer的博客 340

Java自定义注解与注解处理器(二)

自定义注解使用实例

天涯芳草 1063

Unity中实现FairyGUI弹窗背景模糊的3种方法对比(附完整代码)

本文详细对比了Unity中实现FairyGUI弹窗背景模糊的3种方法,包括FairyGUI原生滤镜方案、多摄像机混合渲染方案和渲染纹理动态混合方案。每种方法均附有完整代码示例,帮助开发者根据项目需求选择最佳方案,实现镜头虚化模糊效果,提升游戏UI的视觉沉浸感。

ff678的博客 230

chmod: changing permissions of `/u01/app/oracle/product/11.2.0/dbhome_1/bin/extjobO‘: Operation not

oracle 11.2.0.4安装psu 29141056,日志末尾抛出报错 Patching component oracle.ctx, 11.2.0.4.0... Applying sub-patch '29141056' to OH '/u01/app/oracle/product/11.2.0/dbhome_1' Patching component oracle.rdbms, 11.2.0.4.0... Patching component oracle.rdbms.rman, 11.2.0.

m0_37625564的博客 1833

注解简介及自定义注解处理器

1.基础知识 注解分为标准注解和元注解。注解是代码中的特殊标记,可以在编译,类加载,运行时被读取,并执行相应的处理。 标准注解有4种: @Override 对覆盖超类中的方法进行标记 @Deprecated 对不鼓励使用或已经过时的方法进行标记 @SuppressWarnings 选择性地取消特定代码段中的警告 @SafeVarargs 声明使用了可变长度参数的方法 元注解用来注解其他注解,从而创建新的注解。元注解有以下几种: @Target 注解...

Yang_RT的博客 745

告别代码移植烦恼:STM32CubeMX 6.4.0 + STM32F407ZGT6 + YT8512C PHY芯片的LWIP网络配置全攻略

本文详细介绍了如何使用STM32CubeMX 6.4.0配置STM32F407ZGT6与YT8512C PHY芯片的LWIP网络适配,包括硬件特性解析、STM32CubeMX基础配置、专用驱动适配和LWIP协议栈定制化配置,帮助开发者解决PHY芯片差异导致的网络问题。

weixin_28718793的博客 290

Java注解(三):自定义Java编译时注解处理器

1. 絮絮叨叨 要么是注解跟我有仇,要么是公司配发的笔记本跟我有仇,要么是因为心急吃不了热豆腐 痛定思痛:从头开始,新建一个Java项目,实现一个超级简单的注解@Hello 在 process()方法中简单打印 getSupportedSourceVersion()方法返回的结果 在此,记录一下如何定义一个简单的Java编译时注解处理器 1.1 AbstractProcessor 自定义Java编译时注解处理器,一般都是通过继承AbstractProcessor实现的 AbstractProcesso

lucyLee的博客 9060

网络无线AP信号走场测试软件(Ekahau 使用说明)

每次开启 Ekahau 软件需要重复此过程,才可以正常使用。 双击“Ekahau Pro activation.reg”,如下图所示; 点击“Yes”按钮 ,进行注册表合并; 点击“OK”按钮,确认; 运行“Ekahau Pro” 点击“Close”关闭提示; 点击“OK”,关闭提示; ...

Reyn_观极 6410

【雷达】基于matlab合成孔径雷达干涉测量(InSAR)时序分析【含Matlab源码 9037期】

合成孔径雷达干涉测量(InSAR)时序分析 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 159

java自定义注解处理器_自定义Java里的注解处理器(完)

注解处理过程如图所示,Java编译过程可分为三个步骤:1.将源文件解析为抽象语法树;2.调用已注册的注解处理器;3.生成字节码。如果在第 2 步调用注解处理器过程中生成了新的源文件,那么编译器将重复第 1、2 步,解析并且处理新生成的源文件。每次重复我们称之为一轮(Round)。注解处理是按照 Round 的顺序进行的。在每次进行 Round 操作时,都会请求 Processor 处理在前一个处理...

weixin_39861627的博客 749

【CASS精品教程】035:南方CASS7.1台阶画法案例大全

摘要:本文详细介绍了南方CASS7.1软件中5种台阶工具的使用方法,包括普通台阶、有边台阶、L型台阶、U型台阶和不规则台阶。重点说明各类台阶的绘制步骤和注意事项,如绘制方向(从右下角逆时针连接4个点)、台阶方向标识(白色边为下边)、台阶数自动生成不可更改等特性。同时指出高版本CASS可能存在操作差异,并配以多张示意图直观展示各类台阶的绘制过程和效果,为使用CASS7.1绘制建筑台阶提供了实用指导。(148字)

智慧空间实验室 2920

java自定义注解处理器_java自定义注解学习(注解处理器)

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。注解处理器类库(java.lang.reflect.AnnotatedElement):Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口...

weixin_39818631的博客 253

Superpowers与 OpenSpec、Spec Kit 对比

按照官方仓库定义,Superpowers 是一套构建在 composable skills 之上的完整软件开发工作流。它不是单纯的 prompt 集合,而是把一系列工程动作做成默认流程。一个需要明确的点:Superpowers 并不只偏 Claude Code,根据。

人不风流枉少年 1812

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java注解处理器:自定义注解的自动化处理

首先,定义一个自定义注解,指定其用于什么元素上,以及是否保留。Retention;Target;现在,你可以在你的代码中使用自定义注解了。// 类定义。

linzhongshu的专栏 962

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java自定义注解处理器_深入理解Java:注解(Annotation)--注解处理器

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。注解处理器类库(java.lang.reflect.AnnotatedElement):Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口...

weixin_35161750的博客 99

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

解析 Java 的注解处理器:自定义注解与代码生成

注解的元注解配置Target:指定注解适用的程序元素(如METHODRetention:定义注解保留阶段(用于编译期处理,SOURCE仅保留在源码中)。Repeatable:允许重复注解(Java 8+ 支持)。注解属性的设计模式基础类型:使用StringClass等简单类型作为属性。枚举类型:通过避免枚举类参与编译。嵌套注解:支持注解中包含其他注解,实现复合配置。约束性设计通过注解生成 API 文档。使用@Inherited控制注解的继承性。反模式。

潜意识Java的博客 1272

利用Java的注解处理器生成代码:自定义注解处理器的开发

3. 配置注解处理器:在项目的`META-INF/services`目录下创建一个名为`javax.annotation.processing.Processor`的文件,文件内容为自定义注解处理器的完整类名(包括包路径)。5. 生成代码:在注解处理器的`process`方法中,可以通过`javax.lang.model.util.Elements`和`javax.lang.model.util.Filer`等工具类,生成代码文件。注解可以包含属性,用于传递额外的信息给注解处理器。

m0_75198698的博客 857

JSR-269 Java中的注解处理器:APT工具的原理应用与自定义注解

如果我们要自定义注解处理器,那么必须继承AbstractProcessor类,因此,理解这个类的方法至关重要。// 注解处理工具的集合,包含了众多工具类:如Filer用来编写新文件,Messager用来打印错误,Elements用来处理Element/***//*** 配置支持的选项,如果不重写这个方法,AbstractProcessor类中默认的实现会读取@SupportedOption注解的配置*/else/**

weixin_51360020的博客 1210

java自定义注解处理器_Java注解annotation用法和自定义注解处理器

前言:在J2EE中,注解使得开发更加便利,省去了生成XML文件的过程,在Hibernate实体声明中,可以简简单单的用几个注解就可以免去生成一个XML的文件操作。这里就主要论述一下annotation的用法和自定义注解处理器。当在创建描述符性质的类或接口时,有大量重复性的工作时候,就可以利用注解来实现。基本语法:Java目前包括三种标准注解和四种元注解。元注解主要负责注解其他注解的。三种标准注解:...

weixin_29503445的博客 146

Java中的注解处理器:自定义注解与APT工具的应用场景

在Java开发中,注解(Annotation)是一种非常强大的工具,它不仅可以简化代码,还可以用于编译时的代码检查、代码生成等高级功能。今天我们就来深入探讨一下Java中的注解处理器(Annotation Processor),以及如何利用APT(Annotation Processing Tool)工具来实现自定义注解的应用场景。在Java中,APT(Annotation Processing Tool)是一种用来处理注解的工具,通过它可以在编译期间扫描和处理我们定义的注解。关键字定义一个注解。

微赚开发者技术分享博客 957

Gradle中自定义Java注解处理器源代码:深入解析与应用指南

Gradle中自定义Java注解处理器源代码:深入解析与应用指南 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 自定义Java注解处理器,简化代码开发流程。 项目介绍 在现代Java开发中,注解处理器已经成为一种重要的代码生成和自动化工具。本项目提供了一份详细的源代码,展示了如何在Gradle中自定义实现Java注解处理器。通过学习此项目,开发者可以理解注解...

gitblog_06754的博客 970

@lombok注解背后的原理是什么,让我们走近自定义Java注解处理器

本文介绍了如何自定义Java注解处理器及涉及到的相关知识,看完本文可以很轻松看懂并理解各大开源框架的注解处理器的应用。 《游园不值》 应怜屐齿印苍苔 ,小扣柴扉久不开 。 春色满园关不住 ,一枝红杏出墙来 。 -宋,叶绍翁 本文首发:http://yuweiguocn.github.io/ 关于自定义Java注解请查看自定义注解。 本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。 基本实现 实现一个自定义注解处理器需要有两个步骤,第一是实现Processor接口处理注解,第二是

Java技术江湖 418

java自定义注解处理器_Android自定义注解处理器

前言在android开发中有很多运用到注解处理器(annotation processing)的框架,如常见的Butterknife,Dagger2,EventBus等,运用这些注解处理器框架大大简化了我们的代码。这里主要讲解自定义注解处理器的原理。知识点在自定义注解时,一般需要掌握以下几个知识点:AbstractProcessor相关知识auto-service相关知识javapoet相关知识A...

weixin_30994645的博客 332
上一篇: spring自定义schema学习
下一篇: Mybatis根据数据库表自动生成实体类和xml映射文件及dao
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值