前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中的注解,自定义注解

Java中的注解,自定义注解

作者头像
鱼找水需要时间
发布于 2023-04-23 09:39:28
发布于 2023-04-23 09:39:28
57430
代码可运行
举报
文章被收录于专栏:SpringBoot教程SpringBoot教程
运行总次数:0
代码可运行
框架 = 注解 + 反射 + 设计模式

1. 注解概述

注解(Annotation)是从JDK5.0开始引入,以“@注解名”在代码中存在。

Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=value” 对中。

注解可以在类编译、运行时进行加载,体现不同的功能。

2. 注解与注释

注解也可以看做是一种注释,通过使用 Annotation,可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。但是,注解,不同于单行注释和多行注释。

  • 对于单行注释和多行注释是给程序员看的。
  • 而注解是可以被编译器或其他程序读取的。程序还可以根据注解的不同,做出相应的处理。

3. 注解的重要性

在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,Struts2有一部分也是基于注解的了。

4. 常见的Annotation作用

4.1 生成文档相关的注解

@author: 标明开发该类模块的作者,多个作者之间使用,分割 @version: 标明该类模块的版本 @see: 参考转向,也就是相关主题 @since: 从哪个版本开始增加的 @param: 对方法中某参数的说明,如果没有参数就不能写 @return: 对方法返回值的说明,如果方法的返回值类型是void就不能写 @exception: 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写

4.2 在编译时进行格式检查(JDK内置的三个基本注解)

@Override: 限定重写父类方法,该注解只能用于方法

  • 用于检测被标记的方法为有效的重写方法,如果不是,则报编译错误!
  • 只能标记在方法上。
  • 它会被编译器程序读取。

@Deprecated: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择

  • 用于表示被标记的数据已经过时,不推荐使用。
  • 可以用于修饰 属性、方法、构造、类、包、局部变量、参数。
  • 它会被编译器程序读取。 @SuppressWarnings: 抑制编译器警告
  • 抑制编译警告。当我们不希望看到警告信息的时候,可以使用 SuppressWarnings 注解来抑制警告信息
  • 可以用于修饰类、属性、方法、构造、局部变量、参数
  • 它会被编译器程序读取。
  • 可以指定的警告类型有(了解)
    • all,抑制所有警告
    • unchecked,抑制与未检查的作业相关的警告
    • unused,抑制与未用的程式码及停用的程式码相关的警告
    • deprecation,抑制与淘汰的相关警告
    • nls,抑制与非 nls 字串文字相关的警告
    • null,抑制与空值分析相关的警告
    • rawtypes,抑制与使用 raw 类型相关的警告
    • static-access,抑制与静态存取不正确相关的警告
    • static-method,抑制与可能宣告为 static 的方法相关的警告
    • super,抑制与置换方法相关但不含 super 呼叫的警告

5. 元注解

JDK1.5在java.lang.annotation包定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

(1)@Target:用于描述注解的使用范围

  • 可以通过枚举类型ElementType的10个常量对象来指定
  • TYPE,METHOD,CONSTRUCTOR,PACKAGE…

(2)@Retention:用于描述注解的生命周期

  • 可以通过枚举类型RetentionPolicy的3个常量对象来指定
  • SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
  • 唯有RUNTIME阶段才能被反射读取到。

(3)@Documented:表明这个注解应该被 javadoc工具记录。 (4)@Inherited:允许子类继承父类中的注解

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package java.lang;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

6. 自定义注解

一个完整的注解应该包含三个部分: (1)声明(2)使用(3)读取

声明自定义注解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
【元注解】
【修饰符】 @interface 注解名{
    【成员列表】
}
  • 自定义注解可以通过四个元注解@Retention,@Target@Inherited,@Documented,分别说明它的声明周期,使用位置,是否被继承,是否被生成到API文档中。
  • Annotation 的成员在 Annotation 定义中以无参数有返回值的抽象方法的形式来声明,我们又称为配置参数。返回值类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
  • 可以使用 default 关键字为抽象方法指定默认返回值
  • 如果定义的注解含有抽象方法,那么使用时必须指定返回值,除非它有默认值。格式是“方法名 = 返回值”,如果只有一个抽象方法需要赋值,且方法名为value,可以省略“value=”,所以如果注解只有一个抽象方法成员,建议使用方法名value。

6.1 定义自定义注解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.annotation.*;

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.annotation.*;

@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String columnName();
    String columnType();
}

6.2 使用自定义注解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Table("t_stu")
public class Student {
    @Column(columnName = "sid",columnType = "int")
    private int id;

    @Column(columnName = "sname",columnType = "varchar(20)")
    private String name;
}

6.3 读取和处理自定义注解

自定义注解必须配上注解的信息处理流程才有意义。

自己定义的注解,只能使用反射的代码读取。所以自定义注解的声明周期必须是RetentionPolicy.RUNTIME

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
3 条评论
热度
最新
正在学习Linux,对我的帮助很大
正在学习Linux,对我的帮助很大
回复回复点赞举报
谢谢作者的分享
谢谢作者的分享
回复回复点赞举报
很详细的教程
很详细的教程
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【实用】防暴力破解服务器ssh登入次数
于是乎写出了这个防范措施。防暴力破解服务器ssh登入次数,账号锁定,IP拉黑,日志查看。
释然IT杂谈
2022/10/27
2.1K0
【实用】防暴力破解服务器ssh登入次数
【Linux】linux配置用户多次登录失败后锁定
1.进入/etc/pam.d/password-auth 文件 2.添加配置,以这条配置为例.我在这里只设置错误三次锁定当前用户(不包括root),锁定时间为60秒
MaybeHC
2024/04/23
2.6K0
CentOS7密码安全设置
设置连续输错 5 次口令,账号锁定 5 分钟,先检查 PAM 模块版本,搜索 pam_tally2 是否存在
陳斯托洛夫斯記
2024/08/07
2780
【CentOS7操作系统安全加固系列】第(1)篇
规则描述:设置口令认证失败后的锁定策略 为了保障用户系统的安全,建议用户设置口令出错次数的阈值,以及由于口令尝试被锁定用户的自动解锁时间。用户锁定期间,任何输入被判定为无效,锁定时间不因用户的再次输入而重新计时;解锁后,用户的错误输入记录被清空。通过上述设置可以有效防范口令被暴力破解,增强系统的安全性。
yuanfan2012
2020/11/10
4.1K0
【CentOS7操作系统安全加固系列】第(1)篇
安全: Linux 系统安全简单设置
设置sshd,禁用root 例子: vim /etc/ssh/sshd_config PermitRootLogin yes => PermitRootLogin nosystemctl restar
heidsoft
2018/10/18
1.6K0
安全: Linux 系统安全简单设置
Centos7 服务器基线检查处理汇总
LANG="en_us-utf-8" service rpcbind status
跟着飞哥学编程
2023/03/09
4.2K0
Centos7 服务器基线检查处理汇总
Linux之PAM系统模块详解说明
[TOC] 0x00 前言介绍 Q:什么是PAM? 答:PAM 的全称为可插拔认证模块(Pluggable Authentication Modules:简称 PAM /pæm/ ),Linux中的一
全栈工程师修炼指南
2020/10/26
13.8K2
RH413-RHEL6.4课程总结
RH413-RHEL6.4课程总结 Unit1 Tracking Security Updates 更新分以下三类 RHSA RHBA RHEA yum updateinfo list    查看所有更新 yum updateinfo list --cve=CVE-2013-0755查看某一更新 yum --security list updates    查看安全更新 yum updateinfo list | grep 'Critical'|cut -f1 -d''|sort -u|wc -l Unit2 Managing Software Updates rpm -qa >/root/pre-update-software.$(date +%Y%m%d)    把安装的所有的软件包导入到一个文件 yum updateinfo >/root/updateinfo-report.$(date +%Y%m%d) yum update --security -y    只更新安全的包,安装前gpgcheck=1要开启 yum update --cve=<CVE>    可以更新具体的 rpm --import <GPG-KEY-FILE>    导入安装包的key rpm -qa |grep gpg-pubkey    查看可信的GPG keys rpm -qi gpg-pubkey    查看安装包的详细信息 rpm -K    rpm package    查看安装包的md5值是不是正确 rpm -vvK rpm package    给出调试信息 rpm -qp --scripts rpm package    查看安装包有没有脚本运行 Unit3 Creating File Systems lvcreate -l 100%FREE -n lvname vgname    -l, --extents LogicalExtentsNumber[%{VG|PVS|FREE|ORIGIN}] cryptsetup luksFormat /dev/vgname/lvname    键入YES开始加密格式化,输入密码 cryptsetup luksOpen   /dev/vgname/lvname  luksname    打开并命名 mkfs -t ext4 /dev/mapper/luksname    设置文件系统 mkdir    /secret mount    /dev/mapper/luksname    /secret umout    /secret cryptsetup luksClose luksname    关闭加密 dd if=/dev/urandom of=/path/to/passsword/file bs=4096 count=1    加密文件也可以用明文 chmod    600 /path/to/password/file cryptsetup luksAddkey /dev/vdaN  /path/to/password/file        这里也需要输入密码 touch /etc/crypttab luksname  /dev/vgname/lvname     /path/to/password/file 在/etc/fstab添加如下 /dev/mapper/luksname    /secret     ext4  defaults 1 2    这样就可以开机自动挂载加密分区了 Unit4 Managing File Systems nosuid,noexec    命令没有suid权限和执行权限 tune2fs -l /dev/vd1 |head -n 19 tune2fs -l /dev/vda1 |grep 'mount options' tune2fs -o user_xattr,acl /dev/vda1    给分区添加acl权限,也可以修改/etc/fstab文件 lsattr    查看文件特殊属性 chattr    +、-    语法 a    只能追加 i    禁止修改 Unit5 Managing Special Permissions suid    setUID guid    setGID chmod u+s /path/to/procedure    所有人对程序有运行权限 chmod g+s /path/to/dir   文件夹下生成的文件的所属组不变 find /bin -perm /7000  查找/bin下所有特殊权限位 find /bin -perm  4000  精确查找 find /bin -perm -4000  setUID find /bin -perm -2000  setGID find /bin
三杯水Plus
2018/11/14
6110
centos7.2系统优化 原
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
拓荒者
2019/03/11
1.2K0
多次登录失败用户被锁定及使用Pam_Tally2解锁
在linux系统中,用户多次登录失败会被锁定,一段时间内将不能再登录系统,这是一般会用到Pam_Tally2进行账户解锁。
孙杰
2019/10/29
6.8K0
多次登录失败用户被锁定及使用Pam_Tally2解锁
等保2.0-身份鉴别
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/122
joshua317
2021/09/14
1.1K0
腾讯云上的服务器安全加固
安全加固是企业安全中及其重要的一环,其主要内容包括账号安全、认证授权、协议安全、审计安全四项,今天了解一下购买了腾讯云上的Linux的系统如何加固(CentOS)。
用户8639654
2021/08/03
7.5K0
原创头条 | 如何让主机合规分析报告评分达到90分?
“胖猴,某大型企业高级运维,马哥教育原创作者联盟成员,热爱分享Linux应用技术和原创知识,有30万字以上的原创内容。” 说明:本次文档是根据某厂的主机合规分析报告内容进行整改的,整改后评分达到90分,本次试验环境为Centos6.7。 一、账号管理 1.1密码锁定策略 pam_tally2和pam_faillock PAM 模块都可以允许系统管理员锁定在指定次数内登录尝试失败的用户账户。并在尝试指定次数是进行锁定,防止暴力破解。 检查方法: 查看/etc/pam.d/syst
小小科
2018/05/02
1.3K0
原创头条 | 如何让主机合规分析报告评分达到90分?
Linux多次登录失败用户被锁定使用Pam_Tally2解锁
在Linux系统中,用户多次登录失败会被锁定,一段时间内将不能再登录系统,这是一般会用到Pam_Tally2进行账户解锁。
星哥玩云
2022/07/25
8.7K0
Linux多次登录失败用户被锁定使用Pam_Tally2解锁
Linux用户被锁定后如何解锁
客户的一台机器,按照提供的常用密码尝试使用oracle用户登陆,超过指定次数账号被锁定,提示如下:
Alfred Zhao
2023/08/24
1.1K0
Linux登陆失败处理功能
本文要实现的功能:如果有人恶意尝试破解你的服务器密码,那么这个功能就能帮你起到一定的作用,当尝试密码错误超过设定的次数后,就会锁定该账户多长时间(自行设定),时间过后即可自行解锁,这样可以增加攻击者的成本。
用户5760343
2022/05/24
6.1K0
Linux登陆失败处理功能
ubuntu密码设置规则_密码复杂性策略
将默认配置注释掉,添加一行新的配置,默认的配置为允许root登录,但是禁止root用密码登录
全栈程序员站长
2022/11/10
3.9K0
ubuntu密码设置规则_密码复杂性策略
Linux 系统安全与优化配置
Linux 系统安全与优化配置 Linux 系统安全问题 ---- 目录 1. Openssh 安全配置 1.1. 禁止root用户登录 1.2. 限制SSH验证重试次数 1.3. 禁止证书登陆 1.4. 使用证书替代密码认证 1.5. 图形窗口客户端记忆密码的问题 1.6. 关闭 GSSAPI 1.7. 禁止SSH端口映射 1.8. IP地址限制 2. Shell 安全 2.1. .history 文件 2.2. sudo 安全问题 2.3. 临时文件安全 2.4. 执行权限 3. 防火墙 3.1. 策略
netkiller old
2018/03/05
2K0
用户锁定问题:用户账户被锁定,无法登录
是山河呀
2025/02/04
3700
腾讯云cvm-linux登录不上: PAM模块问题(案例篇)
CVM云服务器通过VNC输入正确的密码后无法正常登录,报错Module is unknown
赵智勇
2020/10/26
18.9K1
腾讯云cvm-linux登录不上: PAM模块问题(案例篇)
相关推荐
【实用】防暴力破解服务器ssh登入次数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验