文档目录:

一、概念

二、注解的使用方法

三、JDK内置注解

四、元注释

五、注解中定义属性

六、反射注解的对象

七、反射注解对象的属性值

---------------------------------------分割线:正文--------------------------------------------------------

一、概念

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)--注解的更多相关文章

  1. java进阶视频分享

    更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...

  2. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...

  3. Java线程间通信方式剖析——Java进阶(四)

    原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...

  4. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  5. 当我们说线程安全时,到底在说什么——Java进阶系列(二)

    原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...

  6. 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)

    本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...

  7. Java进阶(七)正确理解Thread Local的原理与适用场景

    原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...

  8. 【转】JAVA反射与注解

    转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...

  9. Java进阶步骤

    一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kotlin.Groovy.JRuby.J ...

  10. Java进阶

    Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...

随机推荐

  1. 一文讲透消息队列RocketMQ实现消费幂等

    这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等. 1 基础概念 消费幂等是指:当出现 RocketMQ 消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次 ...

  2. 自上而下的LL(1)语法分析法

    LL(1)文法:从文法的开始符,向下推导,推出句子. 对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的 产生式A->α|β 满足下列条件: (1)如果α.β均 ...

  3. Qt+FFmpeg仿VLC接收RTSP流并播放

    关键词:Qt FFmpeg C++ RTSP RTP VLC 内存泄漏 摘要认证 花屏 源码 UDP 本系列原文地址. 下载直接可运行的源码,在原文顶部. 效果 产生RTSP流 比播放文件复杂一点是, ...

  4. Scrapy框架爬取HTTP/2网站

    scrapy本身是自带支持HTTP2的爬取: https://docs.scrapy.org/en/latest/topics/settings.html?highlight=H2DownloadHa ...

  5. python 解析网址信息

    python 解析网址信息 本篇文章主要讲述python 中如何解析一个url的信息. 1: requests获取网页信息 #!/usr/bin/python3 # -*- coding: UTF-8 ...

  6. CENTOS docker拉取私服镜像

    概述 docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker镜像的拉取. centos6版本太老,docker的使用过程中问题较多,centos7相对简单容易. ...

  7. Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?

    Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构? 我们这里指的并不是查询,而是利用Ef的迁移原理,生成可用的其它表架构操作的Sql. 例如你想在Ef Core里建表,并且可能程序里 ...

  8. K8s和声明式编程

    转载:原文链接 认识k8s之后,他的操作模式对我来说是一种很不错的体验.他提供了更接近现实世界的面向对象接口. 什么是k8s? Kubernetes(K8s)是一种开源容器编排平台,用于自动化部署.扩 ...

  9. Kubernetes Headless服务

    1.概述 Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP,也被称为无头服务,通过DNS解析提 ...

  10. Flutter Getx 状态管理 --- (依赖管理) GetxController

    Flutter Getx 简单的状态管理(依赖管理) GetxController Getx 依赖管理简介 Get有一个简单而强大的依赖管理器,它允许你只用1行代码就能检索到与你的Bloc或Contr ...