Java注解

AFSim编译一:windows AFSim在windows上的编译 阅读详情

java注解是Java提供的一种原程序中的元素关联任何信息和任何元数据的途径和方法。

Java中常见的注解

1、jdk自带注解

Java SE5内置了三种标准注解:
@Override:表示当前的方法定义将要覆盖超类中的方法;
@Deprecated:表示该方法已经过时了。当方法或类上有该注解时,说明该方法或类都已经过期不能再用,但不影响以前的项目使用,提醒你使用心得替代方法或类。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。
@SuppressWarnings:表示忽略指定警告,比如@Suppvisewarnings(“Deprecation”)

使用示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、第三方注解

常见的第三方注解:
Spring:@Autowired、@Resource、@Service、@Repository
MyBatis:@Insert、@Update、@Delete、@Select
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注解的分类

  • 按照运行机制分
    源码注解:只在源码中存在,编译成class文件之后就不存在了;
    编译时注解:在源码和class文件中都存在;如JDK自带注解;
    运行时注解:在运行阶段起作用,甚至会影响运行逻辑;如@Autowired;

  • 按照来源分
    JDK自带的注解(Java目前只内置了三种标准注解: @Override、@Deprecated、@SuppressWarnings,以及四种元注解:@Target、@Retention、@Documented、@Inherited)
    第三方的注解——这一类注解是我们接触最多和作用最大的一类
    自定义注解——也可以看作是我们编写的注解,其他的都是他人编写注解

3、自定义注解

1)自定义注解的语法
在这里插入图片描述
1)使用 @interface关键自定义注解
2)成员以无参无异常方式声明
3)可以用default为成员指定一个默认值
4)成员类型是受限的,合法的类型包括原始类型及String,class,annotation,enumeration
5)如果注解只有一个成员,在使用时可以忽略成员名和赋值号(=)
6)注解类可以没有成员,没有成员的注解称为标识注解

2)元注解

@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。

3)注解的保留策略:

@Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

4)注解的作用目标:

@Target(ElementType.TYPE) // 接口、类、枚举、注解
@Target(ElementType.FIELD) // 字段、枚举的常量
@Target(ElementType.METHOD) // 方法
@Target(ElementType.PARAMETER) // 方法参数
@Target(ElementType.CONSTRUCTOR) // 构造函数
@Target(ElementType.LOCAL_VARIABLE) // 局部变量
@Target(ElementType.ANNOTATION_TYPE) // 注解
@Target(ElementType.PACKAGE) // 包

5)注解包含在javadoc中:

@Documented

6)注解可以被继承:

@Inherited

7)注解解析器:用来解析自定义注解,注解解析器的原理就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定处理。

自定义注解的使用示例:

1、通过自定义注解进行赋值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、使用自定义注解结合redis和AOP实现防止重复请求接口

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CacheLock {

    /**
     * 是否启用缓存锁定
     * @return true表示启动,false表示不启动
     */
    boolean isAble() default true;
    /**
     * redis 锁key的前缀
     *
     * @return redis 锁key的前缀
     */
    String prefix() default "";

    /**
     * 过期秒数,默认为5秒
     *
     * @return 轮询锁的时间
     */
    int expire() default 10;

    /**
     * 超时时间单位
     *
     * @return 秒
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * <p>Key的分隔符(默认 :)</p>
     * <p>生成的Key:N:SO1008:500</p>
     *
     * @return String
     */
    String delimiter() default ":";

}
@Aspect
@Component
public class LockMethodInterceptor {

    private static Logger LOG = LoggerFactory.getLogger(LockMethodInterceptor.class);

    @Autowired
    public LockMethodInterceptor(RedisLockHelper redisLockHelper) {
        this.redisLockHelper = redisLockHelper;
    }

    private final RedisLockHelper redisLockHelper;

    @Autowired
    AuthService authService;

    @Around("execution(public * *(..)) && @annotation(com.common.web.CacheLock)")
    public Object interceptor(ProceedingJoinPoint pjp) throws Throwable {


        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();

        CacheLock lock = method.getAnnotation(CacheLock.class);
        if (lock.isAble()) {
            final String lockKey = getLockKey(pjp);
            String value = UUID.randomUUID().toString();

            try {
                // 假设上锁成功,但是设置过期时间失效,以后拿到的都是 false
                final boolean success = redisLockHelper.lock(lockKey, value, lock.expire(), lock.timeUnit());
                if (!success) {
                    throw new CustomException(405, "重复请求");
                }else {
                }

                return proceed(pjp);
            } finally {
                redisLockHelper.unlock(lockKey, value);
            }
        }else {
            return proceed(pjp);
        }
    }

    private Object proceed(ProceedingJoinPoint pjp){
        try {
            return pjp.proceed();
        }catch (Throwable e){
            return ResponseModel.newFailure(500, "服务端操作失败");
        }
    }

    
    /**
     * 生成锁key的方法
     * @param pjp
     * @return
     */
    public String getLockKey(ProceedingJoinPoint pjp) {
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        CacheLock lockAnnotation = method.getAnnotation(CacheLock.class);
        String token = AuthConts.getToken();
        String key = token + lockAnnotation.delimiter() + AuthConts.getUri();
        return "jg:lock:"+lockAnnotation.prefix() + lockAnnotation.delimiter() + key;
    }
}

在这里插入图片描述

参考资料:
Java注释@interface的用法
框架基础——全面解析Java注解

IC设计新手必看:如何正确使用去耦电容(decap)避免电源噪声? 本文深入探讨了IC设计中去耦电容(decap)的应用技巧,从核心原理到布局实现,帮助新手工程师有效抑制电源噪声。文章详细解析了MIM、MOM等电容类型的特性与选择策略,并提供了先进的布局技巧和验证方法,特别适用于28nm以下先进工艺的电路设计挑战。 阅读详情

相关推荐

基于的公司考勤系统(程序+开题报告)(开题报告+源码)

我们将研究和设计系统的架构和功能模块,包括员工信息管理模块、部门信息管理模块、考勤信息记录模块、工资信息计算模块、请假信息处理模块、奖惩信息管理模块、公告信息发布模块、上班打卡模块以及加班申请模块等。目的: 本项目旨在设计并实现一个基于的公司考勤系统,通过该系统,可以实现对员工、部门信息、考勤信息、工资信息、请假信息、奖惩信息、公告信息、上班打卡、加班申请等功能的统一管理。基于的公司考勤系统的设计与实现,旨在通过自动化技术提高考勤管理的效率和准确性,为企业管理提供有力的数据支持。最终成品以下面运行环境。

迟限程序设计 989

Java日记May

May 2020-05-05 ​ 明天,先把day7的pdf讲义上的内容整理到笔记上,再把day7的选做题做完。然后是正常情况下的 一天的流程。 public class 课程安排{ public static void main(String[] args){ if(有课的时候){ 1.听课; 2.上课结束后,先整理笔记,包括课堂笔记和讲义(pdf); 3.做当天的作业题; 4.简单预习一下第二天的课程; } else

skping 840

【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)

文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...

florrie 2万+

java8新特性_18_新时期与日期API_本地时间和时间戳

@Test public void test1(){ LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); LocalDateTime ldt2 = LocalDateTime.of(2019, 9, 26, 21, 48); System.out.println(ldt2); //可以进行年月计算 //加两年 ...

to_real的博客 900

面试中关于Java你所需知道的的一切

面试中关于Java你所需知道的的一切 来源:极客头条 本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺。 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean    boolean数据类型非true即false。这个数据类型表

LiuRenyou的博客 2345

18Java8日期处理

简介 伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API。 Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。 全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)、长短(duration)、日期、时间、时区和周期。 同时继承了Joda 库按人类语言和计算机各自解析的时间处理...

m0_47079048的博客 960

Java基础部分面试总结------1-20

1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象 有哪些属性和行为,并不关注这些行为的细节是什么。 2)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承 信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,...

陆山右的技术博客 432

java注解怎么写_java注解

写在前面现在的java主流框架中,注解无处不在,因此我们完全有必要搞明白注解到底是什么。如何理解注解,它到底是怎么起作用的。注解的定义java是这样定义注解的:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。什么又是元数据的呢?说白了就是描述数据的数据,既然注解被称为元数据,具有描述作用,那么我们是不是可以把注解理...

weixin_42476912的博客 2233

JAVA注解

本文将向你介绍J2SE5.0中的新特性之一:注解。本文将从什么是注解;J2SE5.0中预定义的注解;如何自定义注解;如何对注解进行注解以及如何在程序中读取注解5个方面进行讨论。     一、什么是注解     说起注解,得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义。而J2SE

rj042的专栏 1万+

Java注解以及自定义注解

Java注解以及自定义注解

YIYIYI 1962

Java注解与元注解

使用@interface关键字来定义注解注解中的方法称为注解元素,注解元素可以有默认值。// 定义一个简单的注解注解是用于注解其他注解注解,它们可以控制注解的使用范围、生命周期等。Java 提供了几个元注解,常用的有@Retention@Target和@Inherited。

dsq_MaDing的博客 675

java注解的使用及常用注解

java注解的使用及常用注解

qq_42003527的博客 2334

java 注解 entity_Java 注解

一. 简介注解java5的新特性。注解可以看做一种注释或者元数据(MetaData),可以把它插入到我们的java代码中,用来描述我们的java类,从而影响java类的行为。二. 基本语法1. 注解的使用形式:一个java注解由一个@符后面跟一个字符串构成,类似于这样:@Entityjava注解中一般包含一些元素,这些元素类似于属性或者参数,可以用来设置值,比如我们有一个包含两个元素的@Enti...

weixin_42384743的博客 2331

wwwxxx域名选择(www.xxx.com或者.cn)

域名就是网站的网址,就跟家庭住址一样,那么域名就是我们网站的地址,我们使用方便记忆的域名(字母/数字+.COM等域名后缀:www.xxx.com)。 按所属机构分常见后缀形式: COM:商业性的机构/公司/个人,因为COM这个后缀公信度高,所以用得比较多 ORG :非盈利的组织、团体 GOV:政府部门 NET:从事Internet相关的的机构或公司 EDU:教育机构 .互联网通用顶级域之一,主要供教育机构,如大学等院校使用,实际使用的教育机构大部分位于美国。 注意:还有很多,但是不常见,就先不

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 116万+

(JavaCard)JavaCard222VM Spec(JavaCard 2.2.2 虚拟机规范-中英文对照,第六章)

The CAP File Format CAP文件格式

邹德强(CaesarZou)的专栏 3624

NetBeans 时事通讯(刊号 # 147 - May 18, 2011)

Community Java 杂志——寻找女性技术贡献者你知道有女性在为技术而工作,或着你就是其中的一员?甲骨文正在发起一项新的在线 Java 杂志,并为找到的女性贡献着开辟了“Java Nation”专栏。可以提交包括播客,视频或书面采访的内容。有关更多信息,请访问甲骨文技术网站中的女性技术专栏。 2011年 JavaOne 会议提交提醒提交文件到 JavaOne 的截止日期只剩一星...

anjichan4261的博客 259

115 Java Interview Questions and Answers – The ULTIMATE List--reference

In this tutorial we will discuss about different types of questions that can be used in a Java interview, in order for the employer to test your skills in Java and object-oriented programming in ...

802

执行Runtime.exec异常: error=12,Cannot allocate memory

Exception Trace:In the Linux circumstance, when the program executes till this place:Process p = Runtime.getRuntime().exec(cmdArr);it throws an exception like this:java.io.IOException: Cannot run pr

chifengxin的专栏 8768

PMBOK指南(中文版、英文版)--第3版(2004发布)

PMBOK指南(中文版、英文版)--第3版(2004发布),完整的可复制、可打印的PDF格式版本。

2D板材排版套料开源代码

该开源代码实现的是2d板材套料,使用遗传算法,不断优化得到的解,最后得出一个利用率最高的结果。因为是开源,可以看到其算法的实现,给想做排版的提供了很好的参考。

上一篇: SpringMVC配置类WebMvcConfigurerAdapter学习总结
下一篇: 【Redis学习】Redis分布式锁实现秒杀业务(乐观锁、悲观锁)
May的博客
博客等级 码龄11年 681粉丝 322原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值