Kotlin注解

news2024/11/23 11:36:58

文章参考

1、概念

注解可以对 类、函数、函数参数、属性等 做标注

注解信息可用于 源码级、编译期、运行时

zlz

示例

@Retention(AnnotationRetention.RUNTIME) //作用于运行时
@Target(AnnotationTarget.CLASS) //限定作用于类
annotation class Api(val url: String)

/***  @Retention 保留期   ***/
//AnnotationRetention.SOURCE      源码级: 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。 常用于代码检测。
//AnnotationRetention.BINARY      编译期: 注解被编译到二进制文件,但不会被加载到 JVM 中。 反射不可见。
//AnnotationRetention.RUNTIME   运行时: 注解被编译到二进制文件,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。默认值。可用于运行时反射获取注解信息。


//SOURCE  <  BINARY  <  RUNTIME
//标注为运行时,则在编译期、源码级均可见
//标注为编译期,则在源码级可见

/***   @Target 作用域  ***/
//AnnotationTarget.CLASS                                 可以给一个类型进行注解,类、接口、对象、甚至注解类本身
//AnnotationTarget.FUNCTION                         方法、函数(不包括构造函数)
//AnnotationTarget.CONSTRUCTOR                构造函数
//AnnotationTarget.VALUE_PARAMETER     方法、构造函数的参数
//AnnotationTarget.ANNOTATION_CLASS    可以给一个注解类进行注解
//......


/***  注解类中的参数 (对应次示例中的val url: String) ***/
//仅支持以下类型及其数组(都是在编译器就可以确定的类型, 自定义类型就不行)
//基本类型
//KClass
//枚举
//其他注解
/***  指定注解作用域  ***/
//file                   注解整个文件时指定
//property      (计算)属性(该注解对 Java 不可见)
//field                 字段
//get                    属性 getter
//set                     属性 setter
//receiver          扩展函数或属性的接收者
//param              构造函数参数
//setparam         属性 setter 参数
//delegate           委托属性存储其委托实例的字段

/*** @file ***/
@file:FileAnn("对整个file注解,而不是在package上面就是package的注解")

package com.example.kotlinlearning_zlz.zhujie10

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FILE)
annotation class FileAnn(val message: String)

/*** @receiver  ***/
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER)
annotation class ReceiverFunAnn(val message: String)

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class ReceiverPropertyAnn(val message: String)

fun @receiver:ReceiverFunAnn("这是一个扩展方法注解") Int.display() {
    println(this)
}

val @receiver:ReceiverFunAnn("这是一个扩展属性注解") String.firstChar: Char get() = this[0]


/*** @get @set  ***/
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY_GETTER)
annotation class GetAnn(val message: String)

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY_SETTER)
annotation class SetAnn(val message: String)


class Test(
    @get:GetAnn("属性getter注解")
    val str: String? = null,
    @set:SetAnn("属性setter注解")
    var num: Int = 0
)

2、常见内置注解

在这里插入图片描述

kotlin.annotation.*用于标注注解的注解
kotlin.*标准库的一些通用用途的注解
kotlin.jvm.*用于于Java虚拟机交互的注解

2.1、标注注解的注解 kotlin.annotation.*

在这里插入图片描述

2.2、标准库通用注解 kotlin.*

MetadataKotlin 反射的信息通过该注解附带在元素上
UnsafeVariance泛型用来破除型变限制
Suppress用来去除编译器警告,警告类型作为参数传入

2.3、Java虚拟机相关注解 kotlin.jvm.*

在这里插入图片描述

常用

JvmFiled生成Java Field (不包含setter和getter)
JvmName指定类、函数等生成的Jvm名字(比如,给方法指定一个java不支持的名字,则java便访问不到)
JvmOverloads函数默认参数生成函数重载
JvmStatic生成静态成员
Synchronized标记函数为同步函数
Throws标记函数抛出的异常类型
Volatile生成volatile的Field

JvmOverloads

@JvmOverloads
fun foo(a: Int, b: Int = 0, c: String = "default") {
    // 方法体
}


在这个示例中,使用了 @JvmOverloads 注解来自动生成三个重载方法:
foo(a: Int)
foo(a: Int, b: Int)
foo(a: Int, b: Int, c: String)
这些重载方法可以在 Java 代码中使用,以便在某些情况下忽略一些参数。

Synchronized

@Synchronized
fun getData(){
    
}

Throws

@Throws(IOException::class)
fun getData(){
    throw IOException("这是一个测试Exception")
}

Volatile

在多线程编程中,由于多个线程可能同时访问同一个变量,因此需要确保这些线程之间对变量的访问是同步的。
通常,可以使用锁或其他同步机制来确保线程安全性。
而 @Volatile 注解则提供了一种简单的方式来标记易变变量,以告知编译器和运行时系统需要进行一些特殊的处理。

当一个属性被标记为 @Volatile 后,编译器会生成与之关联的一些特殊指令,以确保对该属性的访问是线程安全的。
在读取或写入该属性的值时,会使用一些特殊的机器指令,以确保不会发生多线程并发访问的问题。
但是需要注意的是,@Volatile 并不能完全解决所有的线程安全问题,
特别是在多个线程同时访问同一个对象时,仍然需要使用其他的同步机制来确保线程安全。

JvmMultifileClass

/*** KotlinAnn1.kt ***/
@file:JvmName("KAnn")
@file:JvmMultifileClass

package com.example.kotlinlearning_zlz.zhujie10.ann

fun test1() {
    println("这是 KotlinAnn 1")
}
/*** KotlinAnn2.kt ***/
@file:JvmName("KAnn")
@file:JvmMultifileClass

package com.example.kotlinlearning_zlz.zhujie10.ann

fun test2() {
    println("这是 KotlinAnn 2")
}
/*** KT.kt ***/
package com.example.kotlinlearning_zlz.zhujie10.ann

fun main(){
    test1()
    test2()
}

KotlinAnn1.kt和KotlinAnn2.kt生成时会合并为一个KAnn.kt

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nachos系统的上下文切换

Fork调用创建进程 在实验1中通过gdb调试初步熟悉了Nahcos上下文切换的基本流程&#xff0c;但这个过程还不够清晰&#xff0c;通过源码阅读进一步了解这个过程。 在实验1中通过执行Threadtest&#xff0c;Fork创建子进程&#xff0c;并传入SimpleThread执行currentThread->…

vulnhub靶场之Wayne Manor

1.信息收集 探测存活主机&#xff0c;发现192.168.239.174存活 对主机进行端口扫描&#xff0c;发现存在端口21、22、80&#xff1b;且21端口状态是filtered。 打开浏览器访问http://192.168.239.174&#xff0c;未发现可疑&#xff0c;进行目录扫描只发现robots.txt。 什…

集合详解之(七)泛型

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;泛型的由来--参数化类型&#x1fa80;元组的介绍 ( int...数组名x )&#x1fa84;类型通配符&#x1f387;使用泛型的注意事项&#x1f3c5;子类继承泛型类【两种情况】 …

Transformers 发展一览

动动发财的小手&#xff0c;点个赞吧&#xff01; Transformers 研究概览 1. 介绍 近年来&#xff0c;深度学习的研究步伐显着加快&#xff0c;因此越来越难以跟上所有最新发展。尽管如此&#xff0c;有一个特定的研究方向因其在自然语言处理、计算机视觉和音频处理等多个领域取…

CLion开发工具 | 04 - CLion内置工具和插件

专栏介绍 一、CLion内置工具 1. SSH终端工具 填写ssh远程连接信息&#xff1a; 连接后在Terminal栏即可使用&#xff1a; 2. HTTP请求 填写http请求内容&#xff0c;并发起请求&#xff0c;方便的一批&#xff1a; 二、插件 1. 管理已安装的插件 2. 简体中文插件 3. 主题…

React 环境搭建,并打包到服务器

一. 安装node.js brew install node 二. 创建react app npx create-react-app my-app cd my-app npm start 默认使用3000端口&#xff0c;本地3000端口被占用&#xff0c;修改/node_modules/react-scripts/scripts/start.js中的端口号 // 这是start.js部分源码 const DEFAU…

【前端客栈】使用CSS实现畅销书排行榜页面

&#x1f4ec;&#x1f4eb;hello&#xff0c;各位小伙伴们&#xff0c;我是小浪。大家都知道&#xff0c;我最近是在更新各大厂的软件测试开发的面试真题&#xff0c;也是得到了很大的反馈和好评&#xff0c;几位小伙伴也是成功找到了测开的实习&#xff0c;非常不错。如果能前…

移除链表元素

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;leetcode练习题 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4a…

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)

在之前的文章 “ChatGPT 和 Elasticsearch&#xff1a;OpenAI 遇见私有数据&#xff08;二&#xff09;” 中&#xff0c;我们详细描述了如何结合 ChatGPT 及 Elasticsearch 来进行搜索。它使用了如下的架构&#xff1a; 在今天的文章中&#xff0c;我们来详细描述实现这个的详…

BatchNormalization 介绍

1 为何要用BatchNormalization 为了让深层网络更容易训练&#xff0c;有两种方法&#xff1a; 使用更好的优化器&#xff1a;如 SDGMomentun等&#xff1b; 改变网络结构&#xff0c;比如加入BN层&#xff0c;处理网络数据&#xff0c;让网络数据服从标准的高斯分布&#xff0…

人群计数传统方法:object detection, regression-based

数据标注方式&#xff1a; &#xff08;1&#xff09;人很少、人很大的时候用bounding box&#xff0c;把人从头到脚都框进长方形方框内&#xff0c;这个方框只用记录三个点的坐标&#xff0c;左下、左上、右下&#xff1b;测试集预测的时候&#xff0c;除了点的坐标还要输出这…

1. 安装Open vSwitch环境

1. 安装Open vSwitch环境 1 配置基础环境。 在VMware Workstation软件中创建一个虚拟机VM1&#xff0c;配置2张网卡&#xff0c;虚拟机VM1配置如图4-3所示。将网卡ens33地址配置为192.168.1.131/24&#xff0c;网卡ens34地址配置为192.168.2.131/24。 图4-3 VM1虚拟机配置 2…

(有假币,因子个数)笔试强训

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、选择1 二、选择2 二、[编程题]有假币 三、[编程题]因子个数 一、选择1 在使用锁保证线程安全时&#xff0c;可能会出现活跃度失败的情况&#xff0c;活跃度失败主要…

【DataGrip】手把手教你使用可视化数据库管理工具DataGrip(附数据库驱动无法下载解决办法)

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Mysql从入门到精通近期目标&#xff1a;写好专栏的每一篇文章 目录 一、…

Android 面试笔记总结,建议吸收一下灵气~

android消息机制 消息机制指Handler、Looper、MessageQueue、Message之间如何工作的。 handler是用来处理消息和接收消息的中间者&#xff0c;handler的创建会伴随着handler中产生looper和MessageQueue&#xff0c;handler依赖于looper&#xff0c;looper依赖于MessageQueue&a…

大学生体质测试管理系统~java

摘要 大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能…

[论文笔记]C^3F,MCNN:图片人群计数模型

(万能代码)CommissarMa/Crowd_counting_from_scratch 代码&#xff1a;https://github.com/CommissarMa/Crowd_counting_from_scratch (万能代码)C^3 Framework开源人群计数框架 科普中文博文&#xff1a;https://zhuanlan.zhihu.com/p/65650998 框架网址&#xff1a;https…

[oeasy]python0141_自制模块_module_reusability_复用性

自制包内容 回忆上次内容 上次导入了外部的py文件 import my_module 导入一个自己定义的模块 可以使用my_module中的变量 不能 直接使用 my_module.py文件中的变量只要加my_module.作为前缀就可以 直接导入导入变量、函数 from my_module import pi 可以导入my_module.pi 并…

面试必问的Java 线程池原理及最佳实践

1. 概述 1.1 线程池是什么 线程池&#xff08;Thread Pool&#xff09;是一种基于池化思想管理线程的工具&#xff0c;经常出现在多线程服务器中&#xff0c;如MySQL。 创建线程本身开销大&#xff0c;反复创建并销毁&#xff0c;过多的占用内存。所以有大量线程创建考虑使用…

【Python_Opencv图像处理框架】直方图与傅里叶变换

写在前面 本篇文章是opencv学习的第五篇文章&#xff0c;主要讲解了直方图与傅里叶变换的有关操作&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正&#x1f970; 写在中间 一、直方图 &#xff08; 1 &…