4.8 注解与自定义注解

Java自定义注解开发指南 Java注解深度解析与应用指南 摘要:本文系统剖析了Java注解的底层机制(基于JDK动态代理实现),详细讲解了自定义注解的四步开发流程(定义、设计、解析、使用),并提供了六大典型应用场景的实战案例,包括数据校验、ORM映射、权限控制等。文章特别强调了Java8+的类型注解与重复注解特性,同时给出性能优化建议(反射缓存、编译时处理)和设计原则(单一职责、明确生命周期)。通过完整的代码示例,开发者可快速掌握注解从基础到进阶的全面应用。 阅读详情


1.概述

在注解刚出现时,曾受到过好多程序员的鄙夷,觉得这就是多此一举的操作;

但随着时间的推移,越来越的多觉得使用注解是一个无比轻松愉快的事情,它可以大大的提高开发效率;

注解很厉害,它可以增强我们的java代码,同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。

传统我们通过xml文本文件声明方式(如下图,但是XML比较繁琐且不易检查),而现在最主流的开发都是基于注解方式,代码量少,框架可以根据注解去自动生成很多代码,从而减少代码量,程序更易读。例如最火爆的SpringBoot就完全基于注解技术实现。
在这里插入图片描述

注解设计非常精巧,初学时觉得很另类甚至多余,甚至垃圾。有了java代码干嘛还要有@注解呢?但熟练之后你会赞叹,它竟然可以超越java代码的功能,让java代码瞬间变得强大。大家慢慢体会吧。

2.注解的分类

注解一共分为3大类,我们先来认识一下:

  • JDK自带注解
  • 元注解
  • 自定义注解

2.1 JDK注解

JDK注解的注解,就5个:

  • @Override :用来标识重写方法
  • @Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期
  • @SuppressWarnings(“deprecation”) 忽略警告
  • @SafeVarargs jdk1.7出现,堆污染,不常用
  • @FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用

2.2 元注解

用来描述注解的注解,就5个:

  • @Target 注解用在哪里:类上、方法上、属性上等等
  • @Retention 注解的生命周期:源文件中、字节码文件中、运行中
  • @Inherited 允许子注解继承
  • @Documented 生成javadoc时会包含注解,不常用
  • @Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用

2.2.1 @Target ElementType…

描述注解存在的位置:

  • ElementType.TYPE:应用于类的元素
  • ElementType.METHOD: 应用于方法级
  • ElementType.FIELD: 应用于字段或属性(成员变量)
  • ElementType.ANNOTATION_TYPE: 应用于注解类型
  • ElementType.CONSTRUCTOR: 应用于构造函数
  • ElementType.LOCAL_VARIABLE: 应用于局部变量
  • ElementType.PACKAGE: 应用于包声明
  • ElementType.PARAMETER: 应用于方法的参数

2.2.2 @Retention RetentionPolicy…

该注解定义了自定义注解被保留的时间长短,比如某些注解仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中; 编译在class文件中的注解可能会被虚拟机忽略,而另一些在class被装载时将被读取。
在这里插入图片描述
为何要分字节码文件中有还是没有呢?如果没有时,反射技术就拿不到,从而就无法去识别处理。它的值一共3种:

  • SOURCE: 在源文件中有效(即源文件保留)
  • CLASS: 在class文件中有效(即class保留)
  • RUNTIME: 在运行时有效(即运行时保留)

3 自定义注解

注意:注解的语法写法和常规java的语法写法不同

package partFour;

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

/*本类用于完成自定义注解*/

public class TestAnotation {
}
//2.通过@Target注解标记自定义注解的使用位置
/*3.通过元注解@Target规定自定义注解可以使用的位置
 *   我们使用"ElemetType.静态常量"的方式来指定自定义注解具体可以加在什么位置
 *   而且,值可以写多个,格式@Target({ElementType.xxx,ElementType.xxx})*/
@Target({ElementType.METHOD,ElementType.TYPE})
//3.通过@Retention注解标记自定义注解的生命周期
/*4.通过元注解@Retention规则自定义注解的生命周期
 *   我们使用"Retention.静态常量"的方式来指定自定义注解的生命周期
 *   注意:值只能写一个:SOURCE CLASS RUNTIME*/
@Retention(RetentionPolicy.RUNTIME)//到运行时都有效
//1.定义自定义注解
        /* 1.首先注意:注解定义的语法与java不同
         * 2.定义自定义注解的格式:@interface  注解名*/
@interface Rice{
    //5.我们可以给注解进行功能增强--添加注解的属性
    /*5.注意:int age();不是方法的定义,而是给自定义注解添加了一个age属性*/
    //int age();//给自定义注解添加一个普通属性age,类型是int
    int age() default 0;//给自定义注解的普通属性赋予默认值0
    /*6.注解中,还可以添加特殊属性value
     * 特殊属性的定义方式和普通属性一样,主要是使用方式不同
     * 注意:特殊属性的名字必须叫value,但是类型不做限制
     * 特殊属性也可以赋予默认值,格式与普通属性一样,不能简写*/
    //String value(); //定义一个特殊属性value,类型是String
    String value() default "lemon";//定义特殊属性并给特殊属性并赋值
}

//4.定义一个类用来测试自定义注解
//@Rice
class TesAnno{
    /*测试1:分别给TestAnno类 name属性 eat方法都添加Rice注解
     * 结论:属性上的注解报错了,说明自定义注解可以加在什么位置,由@Target决定*/
    //@Rice
    String name;
    /*测试2:当我们给Rice注解添加了一个age属性以后,@Rice注解使用时直接报错
     * 结论:当注解没有定义属性时,可以直接使用
     *      当注解定义了属性以后,必须给属性赋值,格式@Rice(age = 10)*/
    /*测试3:给age属性赋予默认值以后,可以直接使用@Rice注解
     * 不需要给age属性赋值,因为age属性已经有默认值0了*/
    /*测试4:给Rice注解添加了特殊属性value以后,必须给属性赋值
     *  只不过特殊属性赋值时可以简写成@Rice("apple")*/
    /*测试5:如果特殊属性也赋予了默认值,那么可以直接使用这个注解
     * 如果要给注解的所有属性赋值,每条赋值都不能简写*/
    @Rice(age = 10,value = "orange")
    //@Rice("apple")//特殊属性可以简写
    //@Rice(age = 10)//普通属性赋值形式
    //@Rice(10) //不能简写,普通属性没有这种格式
    public void eat(){
        System.out.println("干饭不积极,思想有问题");
    }
}
汽车电子RTOS--AUTOSAR OS AUTOSAR OS(AUTomotive Open System ARchitecture Operating System)是AUTOSAR(汽车开放系统架构)标准中的一个重要组件,它是一个专门为汽车电子控制单元(ECU)设计的实时操作系统(RTOS)。AUTOSAR OS旨在提供一个标准化的软件平台,以促进不同供应商和汽车制造商之间的组件复用和协同开发,提高软件质量和降低成本。 阅读详情

相关推荐

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置)

本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。

weixin_33670786的博客 553

java中的field 和 variable的理解,java注解中的ElementType.FIELD和ElementType.LOCAL_VARIABLE

先说一下 field 和 variable 之间的区别: class variables and instance variables are fields while local variables and parameter variables are not. All fields are variables. 成员变量(field)是指类的数据成员,而方法内部的局部变量(local...

Kodulf_007的博客 8687

Python实现课程时间表

用Python实现课程表功能

life is like a play 2034

java8与hibernate_Java 8 LocalDateTime和Hibernate 4

由于Hibernate不支持它,您需要实现一个用户类型,如this示例所示.import org.hibernate.HibernateException;import org.hibernate.engine.spi.SessionImplementor;import org.hibernate.type.StandardBasicTypes;import org.hibernate.usert...

weixin_33074843的博客 149

Cadence OrCAD: 层次化设计 Hierarchical Design

详细介绍OrCAD的原理图层次化设计方法。

Fantasy237的博客 1万+

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 888

Spring Boot 2.7 + JDK8 集成 Knife4j 4.1.0 教程(仅展示带注解接口)

全程适配,无版本兼容问题;依赖仅需引入一个 Knife4j starter,极简集成;精准过滤接口,无注解接口自动隐藏,文档更整洁;注解用法简单,零学习成本,快速落地。

weixin_42502300的博客 335

[QMT和ptrade量化交易小白入门]-125、菜场大妈加上四大现金行业指数风控,最大回撤从22%减少了一半

群里面有人建议,在菜场大妈策略的基础上,加入申万的行业指数(银行,钢铁,有色,煤炭)测算其宽度,当这四大行业其中有一个高就会清仓(用来控制回撤)。这背后的逻辑是,在存量资金博弈的市场环境中,资金总量相对固定,当银行、钢铁、有色、煤炭等大市值周期行业因基本面改善(如涨价、政策催化)或避险需求而走强时,会吸引大量资金涌入,导致其他板块(尤其是小市值股票)面临流动性虹吸。经过回测,对比上一个版本发现确实是可以降低一半的回撤,最大回撤从22.3%降到了11.4%,而且有很多时间是空仓等待。

木头大左的博客 232

EFCorePowerTools代码生成技术:自定义T4模板完全指南

EFCorePowerTools是一款强大的Entity Framework Core开发辅助工具,提供了反向工程、迁移和模型可视化等核心功能。本文将带您深入了解如何通过自定义T4模板来优化代码生成流程,打造符合项目需求的实体类和DbContext。 ## T4模板基础:代码生成的黄金法则 ✨ T4(Text Template Transformation Toolkit)模板是EFCoreP

gitblog_01051的博客 698

I2C 协议在 Camera Sensor 驱动中的典型配置方式与实战应用

在 Linux Camera 系统中,Sensor 与主控之间的控制信令几乎都依赖于 I2C 总线完成。I2C 协议不仅承载了 Sensor 初始化、模式切换、AE/AF 等关键功能的指令传输,也是构建 v4l2\_subdev 驱动框架的核心基础。本文将围绕 Sensor 驱动中的 I2C 通信机制展开分析,从设备树节点声明到驱动代码中的传输接口调用,结合主流平台工程实战经验,详解如何构建稳定、高效、可维护的 I2C 控制路径。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1697

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 1997

PHP 8.4 Accessors与自定义ORM集成全攻略(仅限早期采用者的技巧)

掌握PHP 8.4属性访问器与ORM集成技巧,提升实体类数据控制力。适用于自定义ORM场景,通过getter/setter实现自动类型转换与懒加载。详解属性增强机制与生命周期钩子应用,显著增强代码可维护性,值得收藏。

codeink的博客 706

《测绘综合能力》——大地测量

《测绘综合能力》大地测量 部分重要(常考)知识点(精简版)。

C_xxy's blog 797

注解与自定义注解

1 注解 注解很厉害,它可以增强我们的java代码,同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。 传统我们通过xml文本文件声明方式(如下图,但是XML比较繁琐且不易检查),而现在最主流的开发都是基于注解方式,代码量少,框架可以根据注解去自动生成很多代码,从而减少代码量,程序更易读。例如最火爆的SpringBoot就完全基于注解技术实现。 注解设计非常精巧,初学时觉得很另类甚至多余,甚至垃圾。有了java代码干嘛还要有@注解呢?但熟练之后你会赞叹,它竟然可以超越java代码的功能,

程序媛泡泡的博客 3万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

自定义注解

1、什么是注解? Annontation是Java5开始引入的新特征,中文名称叫注解。 它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观、更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。   Java注解是附加在代码中的一些元信息,用于一些工具在编.

weixin_40482816的博客 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

如何自定义一个Java注解?

Java注解(Annotation)是JDK1.5引入的一种新特性,可以标注在类、方法、变量、参数上,官方定义如下: Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的 一般官方定义都给的晦涩难懂,其实我们简单理解一下,注解就是标注在类、方法、变量、参数上的一种标签,你可以使用JDK内置的注解,也可以自定义注解,通常情况下我们都是使用自定义注解来完成自己的注解功能 注解分为:JDK内置的注解和元注解 JDK内置的注解 1、@

果子爸聊技术 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Java注解系列】内置注解与AOP实现自定义注解

1、深入理解Java注解类型(@Annotation)_zejian_的博客-CSDN博客_java注解 2、java之aop使用及自定义注解 - 沦陷 - 博客园 3、SpringAOP中的JointPoint和ProceedingJoinPoint使用详解(附带详细示例)_如何在5年薪百万的博客-CSDN博客_proceedingjoinpoint有什么用 ...

qq_35789269的博客 4488

java注解详解及自定义注解实现

java注解详解及自定义注解实现

qq_43418737的博客 5505

Java中自定义注解的使用详解

一、注解的概念 1.注解的概念 注解是一种元数据形式。即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。 注解用来修饰,类、方法、变量、参数、包。 注解不会对所修饰的代码产生直接的影响。 2.注解的使用范围 注解又许多用法,其中有:为编译器提供信息- 注解能被编译器检测到错误或抑制警告。编译时和部署时的处理- 软件工具能处理注解信息从而生成代码,XML文件等等。运行时...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

注解的理解,使用与自定义注解

自定义注解类编写的规则:注解类型定义为 @interface,所有的注解会自动继承 java.lang.Annotation 这一接口,而且不能再去继承其他的类或接口;参数成员只能用 public 或 default 两个关键字修饰;参数成员只能用基本类型:byte, short, char, int, long, float, double, boolean,以及 String, Enum, Class, Annotations 等数据类型,以及这些类型的数组;

weixin_45901415的博客 1421

Springboot之自定义注解

Springboot之自定义注解

Java炒饭的博客 8338

Java实现自定义注解

Java实现自定义注解其实很简单,跟类定义差不多,只是属性的定义可能跟我们平时定义的属性略有不同,实现自定义注解需要最少指定两个基本条件:①注解的作用范围②注解的生命周期,那这两个范围怎么指定呢?这个问题问的很好,指定这两个条件,就需要使用到了Java为我们提供的元注解(所谓的元注解:其实就是Java自定义的注解,并且为这个注解赋予了含义,当编译器扫描到这个注解时,就知道该注解是什么作用!)

个人学习博客,不足之处,还望不吝赐教! 1万+

Java自定义注解详解

/ 注解属性声明@MyAnnotation(value = "测试", name = "张三", age = 25, roles = {"admin", "user"})// 方法实现// 当只有value属性需要设置时,可以简写@MyAnnotation("测试")// 方法实现// 字段验证注解// 可验证的接口Java 8引入了@Repeatable元注解,允许在同一元素上多次使用同一注解。// 单个角色注解// 角色容器注解使用合适的保留策略。

yk_dflkg的博客 2983

Java自定义注解及个性化扫描注解

自定义注解 自定义注解三步骤 1、定义注解——相当于定义标记 2、标记注解——把标记打到需要标识的代码中 3、解析注解——在编译期或运行期解析注解,并进行特殊操作 一、定义注解 1.1、代码Demo import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention...

琅琊之榜 7938

自定义注解,jdk注解,jdk1.8新增注解。

1.自定义注解: public @interfase Test{ //没有默认值 String name(); //枚举型注解,并赋予默认值 public enum Course{ CHINESE, MATH }; Course course() defalut Course.MATH; } 例如:  @Test(name="张三", course=Test.Cour

S_First的博客 2630

用自定义注解做点什么——自定义注解有什么用

用自定义注解做点什么 前言 你不一定听过注解,但你一定对@Override不陌生。 当我们重写父类方法的时候我们就看到了@Override。我们知道它表示父类方法被子类重写了。 现在告诉你,@Override就是一个注解。 也许你会疑惑注解是什么? 注解(annotation)是JDK5之后引进的新特性,是一种特殊的注释,之所以说它特殊是因为不同于普通注释(comment)能存在于源码,而且还能存在编译期跟运行期,会最终编译成一个.class文件,所以注解能有比普通注释更多的功能。 接下来,先入个门,然后

qq_43842093的博客 2519
上一篇: 4.9 内部类
下一篇: 4.10 日期类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值