什么是注解,注解怎么用

概念:

什么是注解?

是JDK1.5推出的新特性

  1. 对程序进行标注和解释
  2. 给类增加额外的信息
  3. 注解可以保存一些简单的数据

注解和注释的区别

注释: 给程序员看的
注解: 给编译器看的

使用注解进行配置配置的优势

代码更加简洁,方便
注解也可以代替xml

注解的作用:

  • 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
  • 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
  • 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
JDK自带注解:
注解名说明
@Overridet描述子类重写父类的方法
@Deprecated描述方法过时
@SuppressWarnings压制警告
public class Zi extends Fu{@Override// 告诉编译器这个是重写了父类中的show方法public void show() {System.out.println("子类方法");}@Deprecatedpublic void method(){System.out.println("表示是一个过时的方法");}@SuppressWarnings(value = "all")public void method2(){// 如果有一个类/方法/变量定义好以后没有使用,那么idea就会让它变成灰色,提醒你,这是没有使用过的,// 可以使用SuppressWarnings(压制所有警告),放在类上面也可以的,就等于压制整个类int a = 1;int b = 2;}
}
自定义注解:

格式:

public @interface 注解名称 {public 属性类型 属性名() default 默认值 ;修饰符只能是public也可以不写,
}

接口

public @interface Inter { }

枚举

public enum Aume {SPRING,SUMMER;}
public @interface Zdyzj {//定义一个基本类型的属性int a() default 1998;//定义一个String类型的属性String name() default "itzhuzhu";//定义一个Class类型的属性Class clazz() default Aume.class;//定义一个注解类型的属性Inter inter() default @Inter;//定义一个枚举类型的属性Aume au() default Aume.SPRING;//以上类型的一维数组// int数组int[] IntArr() default {1, 2, 3, 4, 5};//枚举数组Aume[] AumeArr() default {Aume.SPRING, Aume.SUMMER};//特殊属性:value、使用注解的时候,如果只需要给注解的value属性赋值。那么value就可以省略String value();
}
  //在使用注解的时候如果注解里面的属性没有指定默认值。//那么我们就需要手动给出注解属性的设置值。//@Anno1(name = "itzhuzhu")@Anno1("abc")  // 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可public class AnnoDemo {}
@Demo04(price = 6, name = "haha")
public class Demo03 {@Demo04(name="hehe")public static void main(String[] args) {}
}public @interface Demo04 {String name();double price() default 8.88;
}
元注解:

元注解是用来描述注解的注解用的

元注解名说明
@Target指定了注解能在哪里使用
@Retention限制注解能够存活到什么时候,默认是存活到CLASS阶段
@Inherited表示修饰的自定义注解可以被子类继承
@Documented表示该自定义注解,会出现在API文档里面。

自定义注解类:

@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD}) //注解在哪里可以使用依次代表(类、成员变量、方法)
@Retention(value = RetentionPolicy.RUNTIME)  //生命周期
@Inherited
@Zdyzj("itzhuzhu")
public @interface Test {}

使用注解类:

public class UserTest {@Testpublic void show() {System.out.println("show注解");}@Testpublic void method() {System.out.println("method注解");}
}

继承注解的父类:

@Test
public class Fu {}

继承注解的子类:

public class Zi extends Fu{public void show(){System.out.println("子类方法");}
}

测试类:

public class Demo {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {//通过反射获取UseTest类的字节码文件对象Class<?> aClass = Class.forName("zhujie.yuanzhujie.UserTest");//创建对象Object o = aClass.newInstance();//通过反射获取这个类里面所有的方法对象Method[] methods = aClass.getDeclaredMethods();//遍历数组,得到每一个方法对象for (Method method : methods) {// isAnnotationPresent(Class<? extends Annotation> annotationClass):判断当前方法上是否有指定的注解。// 参数:注解的字节码文件对象// 返回值:布尔结果。 true 存在 false 不存在if (method.isAnnotationPresent(Test.class)) {method.invoke(o);}}// 注解继承Class<?> aClass1 = Class.forName("zhujie.yuanzhujie.Zi");// 获取注解,返回true说明就是继承了System.out.println(aClass1.isAnnotationPresent(Test.class));}
}
// @Target(ElementType.PACKAGE)  // 注解只能放在包上
// @Target(ElementType.TYPE) // 注解只能放在类和接口上
// @Target(ElementType.FIELD) // 注解只能放在成员变量上
// @Target(ElementType.CONSTRUCTOR) // 注解只能放在构造器上
// @Target(ElementType.METHOD) // 注解只能放在成员方法上
// @Target(ElementType.LOCAL_VARIABLE) // 注解只能放在局部变量上
// @Target({ElementType.METHOD, ElementType.LOCAL_VARIABLE}) // 注解放在多个位置上
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno4 {
}
注解解析:

什么是注解解析?

得到注解中的属性数据

注解解析相关接口?

方法名说明
T getAnnotation​(Class annotationClass)获取指定类型的注解
Annotation[] getAnnotations​()获取所有注解
boolean isAnnotationPresent​(Class annotationClass)判断是否有指定的注解

实现类: Class, Constructor, Field, Method

如何解析注解?

  • 注解在谁头上就用谁来获取
  • 注解在构造方法上,使用Constructor来获取
  • 注解在成员方法上,使用Method来获取
  • 注解在成员变量上,使用Field来获取
// 我们点左边绿色的三角形,程序就运行起来的.public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {// 解析注解,得到属性的属性// 注解在谁头上就用谁来获取: 注解在成员方法上,使用Method来获取Class<?> cls = Class.forName("com.itzhuzhu.Book");Method m1 = cls.getMethod("sale");// 获取所有的注解Annotation[] as = m1.getAnnotations();for (Annotation a : as) {System.out.println("a = " + a);}System.out.println("-------");// 最好先判断,再获取// boolean isAnnotationPresent​(Class<Annotation> annotationClass) 判断是否有指定的注解boolean b = m1.isAnnotationPresent(BookAnno.class);System.out.println("b = " + b);if (b) {// T getAnnotation​(Class<T> annotationClass) 获取指定类型的注解BookAnno an = m1.getAnnotation(BookAnno.class);System.out.println(an.name()); // 西游记System.out.println(an.price()); // 9.9} else {System.out.println("没有这个注解");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QTimer在linux设置实时线程,为什么我的QTimer只能用于以QThread开头的线程消息,如果我的代码中没有QTimer?...

当(并且仅当)退出我的应用程序时,这些(并且仅这些)重复的消息出现在命令提示符上:QObject::startTimer: QTimer can only be used with threads started with QThreadQObject::startTimer: QTimer can only be used with threads started with QThreadQObject::startTimer: QTi…

一分钟看懂动态代理

动态代理&#xff1a; 在不改变目标对象方法的情况下对方法进行增强 组成部分&#xff1a; 被代理对象&#xff1a;真实的对象代理对象&#xff1a;内存中的一个对象 要求&#xff1a; 代理对象必须和被代理对象实现相同的接口 实现 使用Proxy.newProxyInstance() 举栗子&#…

linux 检查mps版本,linux_mps启动流程_存储相关.doc

linux_mps启动流程_存储相关Linux-mips启动流程-存储相关linux内核启动的第一个阶段是从 /arch/mips/kernel/head.s文件开始的。而此处正是内核入口函数kernel_entry(),该函数定义在 /arch/mips/kernel/head.s文件里。kernel_entry()函数是体系结构相关的汇编语言&#xff0c;它…

Mac - 苹果电脑mac系统释放硬盘空间方法汇总

硬盘空间是大家最头痛的一个问题&#xff0c;大家在硬盘空间变小的时候怎么腾空间的呢&#xff1f;下面为大家分享7个mac系统释放空间的高级方法&#xff0c;大家赶紧来收了&#xff01; mac系统释放硬盘空间方法&#xff1a; 方法一&#xff1a;删除Emacs——可以节省出60MB的…

XML语言

XML&#xff1a; XML是可扩展的标记语言 标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展&#xff1a;标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 xml学习网站https://www.w3school.com.cn/x.asp 作用&#xf…

linux arm current_thread_info定义,linux 内核 current全局变量

在内核的API里经常能够见到一个指针current&#xff0c;它表示的是当前的进程(如果说是一个全局变量虽然不合理&#xff0c;但更容易理解)&#xff0c;current内核路径为&#xff1a;include\asm-generic\current.hcurrent当前进程具体定义&#xff1a;#ifndef __ASM_GENERIC_C…

xml中的Document和Attribute

1.Document 导入dom4j的步骤 去官网下载 zip 包。http://www.dom4j.org/ 在项目中创建一个文件夹&#xff1a;lib将dom4j-2.1.1.jar文件复制到 lib 文件夹在jar文件上点右键&#xff0c;选择 Add as Library -> 点击OK在类中导包使用 得到Document对象 步骤&#xff1a;…

linux here用法,linux shell的here document用法(cat EOF)

什么是Here Document?Here Document 是在Linux Shell 中的一种特殊的重定向方式&#xff0c;它的基本的形式如下cmd << delimiterHere Document Contentdelimiter其作用是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数;比如在终端中…

shell脚本中的条件测试if中的-z到-d的意思

文件表达式if [ -f file ] 如果文件存在if [ -d ... ] 如果目录存在if [ -s file ] 如果文件存在且非空 if [ -r file ] 如果文件存在且可读if [ -w file ] 如果文件存在且可写if [ -x file ] 如果文件存在且可执行 整数变量表达式if [ int1 -eq i…

XPath表达式

什么是XPath XPath&#xff1a;路径表达式 作用&#xff1a;在DOM解析XML时&#xff0c;通过XPath表达让解析更加简单 XPath表达式分类 绝对路径相对路径全文搜索属性查找 什么是Node对象 DOM树中的每个节点就是Node dom4j中与XPath相关的方法 注&#xff1a;使用XPat…

最详细MySQL的安装与介绍Windows

数据库的安装&#xff1a; 打开下载的mysql安装⽂件双击解压缩&#xff0c;运⾏“mysql-5.5.40-win32.msi”。 选择安装类型&#xff0c;有“Typical&#xff08;默认&#xff09;”、“Complete&#xff08;完全&#xff09;”、“Custom&#xff08;⽤户⾃定义&#xff09;”…

linux怎么修改bash,Linux操作系统中如何对Bash变量内容修改?

我们知道两种对变量取胜的方法&#xff1a;echo $HOME echo ${HOME}在echo ${variable}的方法中&#xff0c;还可以对变量的内容进行修改&#xff0c;只要加上一些字符标志&#xff0c;后面再接着使用比对字符串&#xff0c;就可以修改变量的内容了。假设变量名为&#xff1a;v…

读懂基础机器学习算法

本篇内容主要是面向机器学习初学者&#xff0c;介绍常见的机器学习算法&#xff0c;当然&#xff0c;欢迎同行交流。 哲学要回答的基本问题是从哪里来、我是谁、到哪里去&#xff0c;寻找答案的过程或许可以借鉴机器学习的套路&#xff1a;组织数据->挖掘知识->预测未来。…

在c语言中有函数leapyear定义如下,职业教育概论——职业教育的发展历史超星尔雅答案题库...

职业职业展历有时候,文学造诣高的中国诗歌翻译者在用词华丽方面超过莎士比亚。有int型变量x&#xff0c;教育教育i&#xff0c;j&#xff0c;k&#xff0c;则表达式x(i5,j6,k7)的值为( )从数据表student中查询张姓的所有学生&#xff0c;概论正确的SQL语句是( )史超世界上第一个…

tomcat安装启动配置

服务器&#xff1a; 服务器的概念非常的广泛&#xff0c;它可以指代一台特殊的计算机&#xff08;相比普通计算机运行更快、负载更高、价格更贵&#xff09;&#xff0c;也可以指代用于部署网站的应用。我们这里说的服务器&#xff0c;其实是web服务器&#xff0c;或者应用服务…

JS在页面限制checkbox最大复选数

应该是挺简单的代码, 记录一下分享. 首先最直接的想法就是使用循环, 用局部变量记录已选的checkbox, 达到最大值就将余下的checkbox都禁止选择, 例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns"…

c语言 二维数组 文库,c语言二维数组练习题

c语言二维数组练习题 (3页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;19.90 积分完成下列程序代码完成下列程序代码1、 将二维数组(5 行 5 列)的右上半部分置零。 即&#xff1a;1234510000678910…

Mysql基础语法DDL、DML、DQL

DDL&#xff1a; DDL(Data Definition Language)数据定义语言用来定义数据库对象&#xff1a;数据库&#xff0c;表&#xff0c;列等。关键字&#xff1a;create, drop,alter 等 DML语句操作关键字添加INSERT INTO 表名 (字段名) VALUES (值);修改UPDATE 表名 SET 字段名新的值…

UVA 12716 GCD XOR(数论+枚举+打表)

&#xfeff;&#xfeff;题意&#xff1a;给你一个N&#xff0c;让你求有多少组A,B, 满足1< B < A < N, 且 gcd(A,B) A XOR B。思路&#xff1a;首先我们能够得出两个结论&#xff1a; A-B > A%B > gcd(A, B) A xor B > A-B 所以说A xor B > A-B > …

android陀螺仪轨迹,陀螺仪轨迹法长距离管道测量精度实测分析

陀螺仪轨迹法长距离管道测量精度实测分析陀螺仪轨迹法用于非开挖管道的精准坐标与位置测量已被电力与燃气等行业逐步了解与接受&#xff0c;近两年不断被引入到城市地下管线探测及电力与燃气管道验收标准中。由于管道埋于地下往往不能眼见为实&#xff0c;作为一种新的测量方式…