注解的使用和自定义

Android PMS——概述(一) PMS(Package Manager Service)是 Android 操作系统的一个重要组件,它负责管理应用程序的包信息以及与应用程序的安装、卸载、权限控制等相关功能,确保应用程序的安全性和稳定性。 Android PMS 负责维护一个应用程序包的清单信息,该清单是一个 XML 文件,包含应用程序的各种元数据,例如应用程序的包名、版本号、权限要求、组件信息等。PMS通过访问该清单文件来获取应用程序的信息。 此外,Android PMS 还负责应用程序的安装和卸载。在安装应用 阅读详情

在 Java 里,注解是一种元数据形式,它能够为程序元素(像类、方法、字段等)添加补充信息。这些信息不会对程序的运行逻辑造成影响,但可以在编译阶段、运行阶段被读取并加以利用。下面为你详细介绍注解的使用方法以及自定义注解的编写方式:

内置注解

Java 自身提供了一些内置注解,常见的有:

  • @Override:此注解用于标明某个方法是对父类方法的重写。
  • @Deprecated:表示某个程序元素已过时,不建议再使用。
  • @SuppressWarnings:用于抑制编译器产生的警告信息。
  • @FunctionalInterface:用于标记某个接口是函数式接口。

元注解

元注解的作用是对注解进行注解,Java 定义了以下几种元注解:

  • @Retention:它指定了注解的保留策略,可选值有:
    • RetentionPolicy.SOURCE:注解仅在源代码阶段保留,编译时会被编译器丢弃。
    • RetentionPolicy.CLASS:注解会被保留到编译后的 class 文件中,但运行时不会被 JVM 读取。
    • RetentionPolicy.RUNTIME:注解在运行时可以被 JVM 读取,能够通过反射机制获取注解信息。
  • @Target:用于限定注解可以应用的程序元素类型,例如:
    • ElementType.TYPE:可以应用于类、接口、枚举等类型。
    • ElementType.METHOD:只能应用于方法。
    • ElementType.FIELD:只能应用于字段。
    • 还有其他多种可选值,如PARAMETER、CONSTRUCTOR等。
  • @Documented:该注解表明它所修饰的注解会被包含在 JavaDoc 文档中。
  • @Inherited:此注解使得子类可以继承父类的注解。
  • @Repeatable:从 Java 8 开始支持,允许在同一个程序元素上重复使用同一个注解。

自定义注解的定义

下面通过一个示例来展示如何定义自定义注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义一个可以在类和方法上使用的运行时注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // 定义注解的属性,带有默认值
    String value() default "";
    int count() default 1;
    Class<?> category() default Void.class;
}

注解属性的定义

在自定义注解时,需要注意以下几点:

  • 注解属性的返回类型只能是以下几种:基本数据类型、String、Class、枚举类型、注解类型,以及这些类型的数组。
  • 定义属性的语法为type attributeName() default defaultValue;,其中default部分是可选的。
  • 如果注解中只有一个属性,通常将其命名为value,这样在使用注解时可以省略属性名。

注解的使用

以下是使用自定义注解的示例:

@MyAnnotation(value = "Example", count = 3, category = MyClass.class)
public class MyClass {
    @MyAnnotation("Method Annotation")
    public void myMethod() {
        // 方法实现
    }
}

通过反射读取注解

当注解的保留策略为RUNTIME时,可以利用反射机制来读取注解信息:

import java.lang.reflect.Method;

public class AnnotationProcessor {
    public static void main(String[] args) throws NoSuchMethodException {
        // 获取类上的注解
        Class<?> clazz = MyClass.class;
        if (clazz.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation classAnnotation = clazz.getAnnotation(MyAnnotation.class);
            System.out.println("Class Annotation: " + classAnnotation.value());
            System.out.println("Count: " + classAnnotation.count());
            System.out.println("Category: " + classAnnotation.category().getName());
        }

        // 获取方法上的注解
        Method method = clazz.getMethod("myMethod");
        if (method.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
            System.out.println("Method Annotation: " + methodAnnotation.value());
        }
    }
}

重复注解的使用(Java 8+)

Java 8 引入了对重复注解的支持,使用方式如下:

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义重复注解容器
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Filters {
    Filter[] value();
}

// 定义可重复注解
@Repeatable(Filters.class)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Filter {
    String value();
}

// 使用重复注解
public class RepeatingAnnotationsExample {
    @Filter("auth")
    @Filter("logging")
    public void process() {
        // 方法实现
    }
}

// 读取重复注解
public class RepeatingAnnotationsProcessor {
    public static void main(String[] args) throws NoSuchMethodException {
        Method method = RepeatingAnnotationsExample.class.getMethod("process");
        Filter[] filters = method.getAnnotationsByType(Filter.class);
        for (Filter filter : filters) {
            System.out.println("Filter: " + filter.value());
        }
    }
}

注解的应用场景

注解在实际开发中有多种应用场景,例如:

  • 编译时检查:像@Override注解,用于确保方法正确重写了父类方法。
  • 代码生成:例如 Lombok 库通过注解自动生成 Getter、Setter 等代码。
  • 运行时处理:Spring 框架使用@Autowired、@Component等注解实现依赖注入。
  • 序列化:Jackson 库使用@JsonProperty等注解控制 JSON 序列化和反序列化的行为。
  • 测试框架:JUnit 使用@Test、@BeforeEach等注解标记测试方法和配置方法。

最佳实践

在使用注解和自定义注解时,建议遵循以下最佳实践:

  • 保持注解的简洁性,避免在一个注解中定义过多的属性。
  • 为注解属性设置合理的默认值,减少使用注解时的冗余代码。
  • 为注解提供清晰的文档说明,解释其用途和属性的含义。
  • 优先使用运行时注解(RetentionPolicy.RUNTIME),以便在运行时能够利用反射机制进行处理。
  • 考虑使用重复注解来提高代码的可读性。
【技能】伪真openclaw主动式智能体—告别‘巨婴’AI工具人:体验主动智能体的魅力 摘要: 传统AI常因被动执行、缺乏闭环而令人抓狂。Proactivity主动执行能力将AI从"指令跟随者"升级为"主动合伙人",具备预判需求、自动推进、断聊恢复、问题自解等能力。其核心原理在于建立AI专属工作体系(持久化内存、动态任务层、临时缓存层、归档复盘层),通过7步闭环(感知触发→状态恢复→边界校验→方案探索→动作决策→执行落地→状态留存)确保安全高效。 阅读详情

相关推荐

Circos在Windows下的安装教程

这里写自定义目录标题Circos简介安装Perl 的安装Circos安装安装及解压安装Modules测试用例官方文档 Circos简介 (来源官网:http://circos.ca/software/readme/ O.INTRODUCTION部分) Circos is a program for the generation of publication-quality, circularly composited renditions of genomic data and related annot

qq_42318911的博客 1656

自定义注解使用

注解使用

qq_36042938的博客 3451

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2551

自定义注解的使用

自定义注解的使用 文章目录自定义注解的使用前言一、注解是什么?二、四个元注解三、自定义注解示例1.原生方式2.读入数据总结 前言 一、注解是什么? 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解 一般常用的注解可以分为三类: 一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@Suppres

weixin_41979002的博客 4505

电子结构设计(EMD)十年知识总结

客官,你的面相是做结构设计的奇才~1. 材料选择【一出手的0.1s就败了】2. 钣金件设计【折来折去有啥难】3. 塑胶件设计【看着好复杂】4. 型材件设计【凭啥不让我设计】5. 电子结构(PCBA)设计【静电肿么要我背锅】6. 包装设计【要的就是金玉其外,败絮其中】7. 外观(工业)设计【好不好看,谁说了算】8. 标签设计【】9. 标准件选择【一个螺丝难倒英雄汉/提起螺丝,英雄气短】10. 计算仿...

wfeng86的博客 1564

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 162

spring自定义注解及使用

一文搞懂spring自定义注解及使用场景

ZHANGLIZENG的博客 9994

态路小课堂丨三款800G光模块方案介绍—SR8/DR8/2FR4

800G QSFP-DD 2FR4光模块使用CWDM4波长(1271/1291/1311/1331nm),单通道速率为100G,通过MUX减小光纤的数目,其光学接口采用CS接口或双芯LC接口。

poposu的博客 2371

自定义注解使用(Custom Annotation)

自定义注解(Custom Annotation)是Java语言中一种特殊的接口,它允许创建自己的注解类型,以便在代码中标记特定的元素(如类、方法、变量等)。注解在Java 5中引入,用于提供元数据(关于代码的额外信息),这些元数据可以在编译时、类加载时或运行时被读取和处理。

weixin_44929475的博客 818

学术报告系列(二) - 智能自主作业机器人感知与控制技术及发展趋势

收集整理于2022年模式识别高峰论坛湖南大学王耀南院士报告(报名题目:智能自主作业机器人感知与控制技术及发展趋势)

Make something people want. 4694

AD20 Channel-Offset Error 解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法一、问题现象二、解决办法 前言 AD20 PCB相同电路模块ROOM格式复用时出现 Channel-Offset Error 解决办法 一、问题现象 我们经常在使用Room格式快速布局相同模块电路时出现以下问题, 二、解决办法 相同模块电路PCB布局复制的过程网上有很多,这里不再做赘述,步骤都差不多,只说问题根源; 1:.

m0_47201213的博客 7603

注解的使用和自定义注解

JDK中的三个基本注解a、@Override:检查子类确实是覆盖了父类的方法。 b、@Deprecated:说明已经过时了。 c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的类型。{}数组。all抑制所有警告。 简单使用:public class Demo1 { //@SuppressWarnings({ "

melissa_hexiu的博客 6881

GEE:基于MODIS数据计算NDVI时间序列,并使用Savatsky-Golay(SG)滤波器对其进行平滑处理

CSDN@_养乐多_本文将介绍如何在 Google Earth Engine (GEE) 平台中,使用 MODIS 数据计算 NDVI 时间序列,并对该数据集应用 Savitzky-Golay 滤波器,得到了一个新的平滑后的数据集。Savitzky-Golay 滤波器可以有效地去除信号中的噪声,并平滑信号的变化。该方法可以扩展到基于 MODIS 数据计算的任何指数或者波段。

养乐多的博客 1417

java注解详情及自定义注解和使用场景

java注解详情及自定义注解和使用场景注解概念jdk预定义的注解jdk提供了4个元注解JDK中给我们提供的4个元注解1.@Target:描述当前注解能够作用的位置2.@Retention: 描述注解被保留到的阶段3.@Documented:描述注解是否被抽取到JavaDoc api中4.@inherited:描述注解是否可以被子类继承自定义注解注解的样式注解的本质自定义注解自定义注解定义studnet1类测试注解应用场景场景一:自定义注解+拦截器 实现登录校验场景二:自定义注解+AOP 实现接口执行时间打印

weixin_42371621的博客 1866

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

自定义注解和@Target、@Retention注解的使用

自定义注解和@Target、@Retention注解的使用

小何的博客 2349

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java 中创建和使用自定义注解

声明注解指定目标元素类型使用@Target元数据注解来指定你的自定义注解可以应用于哪些类型的程序元素。指定保留策略使用@Retention元数据注解来指定编译器如何保留注解信息。定义注解成员在注解接口中定义成员变量,这些成员变量可以用在使用注解的地方。指定重复性使用元数据注解来允许在单个程序元素上多次使用相同的注解。指定容器注解如果注解支持重复使用,还需要定义一个容器注解。下面是一个自定义注解@Dict的完整定义,它可以被用来标记字段,并可以携带一些元数据,比如字典类型和描述。

weixin_42564451的博客 1608

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVA自定义注解的使用和定义

最近有所了解到自定义注解的应用,因此学习了一下,在项目后台接口开发中,数据的传输经常有对数据内容格式及一些信息规则的校验,应用注解在数据进入后台的开始使用自定义注解是一种比较可靠的方案。 一、注解的概念及分类        1.首先我们来看一下什么是注解:        注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编

tanyunlong_nice的专栏 7302

JSR303校验注解的使用 和 自定义校验注解

引入validation依赖 <!--JSR303依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> /*Null检查 @Null(message = "") 验证对象是否为null

诗水人间 13万+

【SpringMVC】自定义注解和使用(看完它相信我)

定义注解:使用注解语法,在相关的注解类上定义自定义注解,可以指定注解的目标范围和属性。标记使用:在控制器类、方法或者方法参数上使用自定义注解,标识需要应用自定义逻辑的地方。处理注解:通过Spring的AOP、拦截器等机制,对标记了特定自定义注解的类、方法或者参数进行处理,实现相关的功能。注解分类(根据Annotation是否包含成员变量,可以把Annotation分为两类)标记Annotation:没有成员变量的Annotation;这种Annotation仅利用自身的存在与否来提供信息。

无法自律的人的博客 2312

AOP和自定义注解的使用

AOP和自定义注解的笔记

asdhls的博客 843

SpringBoot 自定义注解及 AOP 的开发和使用

在SpringBoot中使用自定义注解就是如此简单,一般在通知方法中我们还会结合反射来获取执行方法的一些信息,如方法名,参数,响应值等,在后面我也会新开一篇文章专门讲讲反射,有兴趣的掘友可以关注一下哦!在公司项目中,如果需要做一些公共的功能,如日志等,最好的方式是使用自定义注解,自定义注解可以实现我们对想要添加日志的方法上添加,这篇文章基于日志功能来讲讲自定义注解应该如何开发和使用。在test()方法上添加了一个@Log注解,他会在执行这个方法时,执行我们之前定义切面时创建的前置方法、后置方法、环绕方法。

z1ztai的博客 783

java注解的自定义和使用

Java还提供了4中注解,专门负责新注解的创建: @Target: 表示该注解可以用于什么地方,可能的ElementType参数有: CONSTRUCTOR:构造器的声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类型)或enum声明 @Retent...

weixin_43944806的博客 321

Spring boot 创建自定义注解和使用

创建注解类 @Retention(value = RetentionPolicy.RUNTIME) public @interface TxtDataSource { String fileType() default "txt"; String spilt() default ";"; String eof() default "||"; String lineEnd() default "~"; String encoding() default "GBK";

洛阳泰山的博客 3371

深入Spring 自定义注解加载和使用

深入Spring 自定义注解加载和使用

hgffhh的博客 751

Spring Aop 和 自定义注解的使用的详解

什么是AOP AOP,Spring框架的两大核心之一,又称面向切面编程,通过代理模式,对原有的类进行增强。在Spring框架中,AOP有两种动态代理方式,其一是基于JDK的动态代理,需要代理的类实现某一个接口;其二是基于CGLIB的方式,该方式不需要类实现接口就能进行代理。AOP的应用场景,常见的就是事务的处理和日志的记录,还有权限的认证。(笔者使用AOP的场景:保存所有用户对数据进行的增删改内容等,比如,张三修改了一个表格数据的值,就需要记录谁,什么时候,修改or添加or删除,哪项数据,...

m0_57764322的博客 2845

自定义注解基本概念和使用

interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)可以通过default来声明参数的默认值。语义清晰:自定义注解可以使代码的意图更加明确和可读。例如,使用 @Transactional 注解可以清晰地表明某个方法需要事务支持,而不需要查看AOP配置或切面代码。简化配置:可以简化配置,减少样板代码。

учёба 1200
上一篇: Java 垃圾回收
下一篇: Git的使用
黄青祥
博客等级 码龄4年 891粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值