java进阶(42)--注解
文档目录:
---------------------------------------分割线:正文--------------------------------------------------------
一、概念
1、注解即注释:Annotation
2、引用数据类型,编译之后包生成xxx.class文件
3、自定义注解:语法[修饰符列表]@interface 注解类型名{}
二、注解的使用方法
1、注解使用时语法格式:@注解类型名
2、注解可以出现在类、属性、方法、变量等几乎任意类型上
三、JDK内置注解
1、@Deprecated注解
表示注解的元素已过时,有更好的解决方案
2、@Override注解
只能注解方法,给编译器参考的,如果不是重写父类方法时编译器会报错
1 @Override
2 public String toString() {
3 return "AnnotationTest01{" +
4 "no=" + no +
5 '}';
6 }
四、元注释
注解注解的注解
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.SOURCE)
3 public @interface Override {
4 }
1、@Target注解
用来标注的注解可以出现在哪些位置上
2、@Retention注解
表示该注解被保存的位置
五、注解中定义属性
1、如果一个注解中有属性,那必须给属性赋值,除非属性有defalut默认值
注解:
package com.bk.java.Test42;
public @interface MyAnnotation {
String name();
int no() default 1;
}
测试程序:
1 package com.bk.java.Test42;
2
3 public class AnnotationTest01 {
4 @MyAnnotation(name="test01")
5 private int no;
6 public static void m1(){
7 int i=100;
8 }
9 public AnnotationTest01(){
10 }
11
12 public String toString() {
13 return "AnnotationTest01{" +
14 "no=" + no +
15 '}';
16 }
17 }
2、如果属性值是value且只有一个属性时,使用时可以省略。
注解:
package com.bk.java.Test42;
public @interface MyAnnotation {
String value();
}
测试程序:
1 package com.bk.java.Test42;
2
3 public class AnnotationTest01 {
4 @MyAnnotation("testvalue01")
5 private int no;
6 @MyAnnotation(value = "testvalue02")
7 public static void m1(){
8 int i=100;
9 }
10 public AnnotationTest01(){
11 }
12
13 }
3、注解的属性类型为数组
注解中可以使用的类型为:
byte、short、int、long、float、double、boolean、char、String、Class以及每一种的数组形式
注解:
package com.bk.java.Test42;
public @interface MyAnnotation {
String value();
}
测试程序:当数组只有一个类型时,大括号可以省略
1 package com.bk.java.Test42;
2
3 public class OtherAnnotationTest01 {
4 @OtherAnnotation(age = 10,email = {"zhang@123.com","li@qq.com"})
5 public void doSome(){}
6 @OtherAnnotation(age=25,email = "wang@wangyi.com")
7 public void doOther(){}
8 }
六、反射注解的属性值
注解:
package com.bk.java.Test42; 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 MyAnnotation02 {
String Value() default "北京";
}
注解测试:
package com.bk.java.Test42; @MyAnnotation02
public class MyAnnotationTest02 { int i;
public MyAnnotationTest02(){
}
@MyAnnotation02
public void doSome(){
int i;
}
}
测试反射注解:
1 package com.bk.java.Test42;
2
3 public class ReflectAnnotationTest02 {
4 public static void main(String[] args) throws ClassNotFoundException {
5 //获取类
6 Class c= Class.forName("com.bk.java.Test42.MyAnnotationTest02");
7 //判断是否此类是否有注解对象
8 if(c.isAnnotationPresent(MyAnnotation02.class)){
9 MyAnnotation02 myAnnotation02=(MyAnnotation02)c.getAnnotation(MyAnnotation02.class);
10 System.out.println("类上的注解对象"+myAnnotation02);
11 //获取注解对象的属性
12 String value=myAnnotation02.Value();
13 System.out.println(value);
14 }
15 }
16 }
查看代码运行结果:
类上的注解对象@com.bk.java.Test42.MyAnnotation02(Value=北京)
北京
七、反射方法上的注解信息
注解:
1 package com.bk.java.Test42;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Retention;
5 import java.lang.annotation.RetentionPolicy;
6 import java.lang.annotation.Target;
7
8 @Target(ElementType.METHOD)
9 @Retention(RetentionPolicy.RUNTIME)
10 public @interface MyAnnotation03 {
11 String username();
12 String password();
13 }
注解测试:
1 package com.bk.java.Test42;
2
3 import java.lang.reflect.Method;
4
5 public class MyAnnotationTest03 {
6 @MyAnnotation03(username="admin",password = "123")
7 public void doSome(){};
8
9 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
10 Class c=Class.forName("com.bk.java.Test42.MyAnnotationTest03");
11 //获取doSome方法
12 Method doSomeMethod=c.getDeclaredMethod("doSome");
13 //判断方法上是否有这个注解
14 if(doSomeMethod.isAnnotationPresent(MyAnnotation03.class)){
15 MyAnnotation03 myAnnotation03=doSomeMethod.getAnnotation(MyAnnotation03.class);
16 System.out.println(myAnnotation03.username());
17 System.out.println(myAnnotation03.password());
18 }
19 }
20 }
查看运行结果:
admin
123
java进阶(42)--注解的更多相关文章
- java进阶视频分享
更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- Java线程间通信方式剖析——Java进阶(四)
原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)
本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...
- Java进阶(七)正确理解Thread Local的原理与适用场景
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...
- 【转】JAVA反射与注解
转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...
- Java进阶步骤
一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kotlin.Groovy.JRuby.J ...
- Java进阶
Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...
随机推荐
- [ABC263C] Monotonically Increasing
Notes For two integer sequences of the same length $A_1,A_2,\dots,A_N$ and $B_1,B_2,\dots,B_N$, $A$ ...
- IoC入门案例
1.管理什么?(Service和Dao) 2.如何将被管理的对象告知IoC容器?(配置) 3.被管理的对象交给IoC容器,如何获取IoC容器?(接口) 4.IoC容器得到后,如何从容器中获取到bean ...
- C++学习笔记四:变量与数据类型(布尔型与字符型)
今天来整理一下布尔型和字符型变量的基本使用方法1)布尔型变量1. 声明和初始化一个布尔类型的变量占据1 Byte空间,数值0代表false,其他非0数值代表true bool red_light {f ...
- 看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
前言 缓存是提升程序性能必不可少的方法,Asp.net core 支持多级缓存配置,主要有客户端缓存.服务器端缓存,内存缓存和分布式缓存等.其中客户端缓和服务器端缓存在使用上都有比较大的限制,而内存缓 ...
- Codeforces Round 911 (Div. 2) 总结
第一次在赛场上敲莫反,还好最后调出来了! A 题意:你在Minecraft里挖了一些一格的坑(同一列),问你用几桶水可以填满它(可以造无限水). 解法:找大于 \(2\) 的连续段,有的话就是两桶,没 ...
- ASR项目实战-方案设计
对于语音识别产品的实施方案,给出简易的业务流程,仅供参考. 如下流程图,可以使用如下两个站点查看. web chart Web Sequence Diagrams 文件转写 创建文件转写任务 客户应用 ...
- redis + AOP + 自定义注解实现接口限流
限流介绍 限流(rate limiting) 是指在一定时间内,对某些资源的访问次数进行限制,以避免资源被滥用或过度消耗.限流可以防止服务器崩溃.保证用户体验.提高系统可用性. 限流的方法有很多种 ...
- 文心一言 VS 讯飞星火 VS chatgpt (22)-- 算法导论4.2 2题
二.为Strassen算法编写伪代码. 文心一言: Strassen算法是一种用于矩阵乘法的算法,它的核心思想是通过不断将原始矩阵分割成较小的子矩阵来实现高效的乘法运算.以下是Strassen算法的伪 ...
- 数仓性能调优:row_number() over(p)-rn=1性能瓶颈发现和改写套路
本文分享自华为云社区<GaussDB(DWS)性能调优:row_number() over(p)-rn=1性能瓶颈发现和改写套路>,作者:Zawami . 1.改写场景 本套路应用于子查询 ...
- 零代码修改,教你Spring Cloud应用轻松接入CSE
摘要:本文介绍了Sermant Agent的接入原理和如何使用Sermant Agent无修改接入CSE. 本文分享自华为云社区<Spring Cloud应用零代码修改接入华为云微服务引擎CSE ...