java的注解_java-注解相关

注解

概念:说明程序的,给计算机看

注释:用文字描述程序

77c78dbe4d3668cbebb699f8278a2c10.png

先了解一些怎么正常javadoc文档

1:给类或者方法添加doc注释

2:通过命令javadoc 执行 类.java文件

新建的类:

/*** 注解doc演示

*@authorquan

*@sincejdk 1.7

*@version1.8*/

public classAnnotation {/*** 计算两个数的和

*@parama 整数

*@paramb 整数

*@return两束的和*/

public int dd(int a,intb){return a+b;

}

}

快捷键:

在类的所在的文件夹里面

shift+右键就能在这个路径下打开命令行

d2b04de5e02346482643c022b3f95130.png

执行命令

d0738e5192d05470a2f4c3e592dd9ec3.png

查看生成的api文件

eff8dde441201492fdf932e0a3e44269.png

JDK种预定义的一些注解

1c31df9759acfe984534671b7f6d0343.png

0c90f68d1c395bb2551f4e95a8283e49.png

没加入SupperssWarning的时候:

会出现一些告警

1993e98eff5de043ca3c266dc94045ca.png

自定义注解

格式

public @interface 注解名称

本质: 注解的本质就是一个接口,改接口默认继承Annotation接口

PS C:\Users\quan\Desktop\date>javac .\Myannotation.java

PS C:\Users\quan\Desktop\date> javap .\MyAnnotation.classCompiled from"Myannotation.java"

public interface MyAnnotation extendsjava.lang.annotation.Annotation {

}

属性:接口种可以定义的成员的方法

要求:

属性的只能返回值类型:基本数据类型 String 枚举 注解 以及他们的数组

定义了属性,在使用时需要给定属性的值

如果定义属性的时候,利用default关键字给定属性初始值,则使用注解时可以不赋值

如果只有一个属性需要赋值,并且属性名称时value,则value可以升序,直接定义值即可

数组赋值时,值使用大括号包裹,如果数组之哟一个值,大括号可以不写

枚举类:

public enumPersonE {

p1,p2,p3;

}

自定义注解:

public @interfaceMyAnnotation {//抽象方法

public String show() default "ALL";public intage();publicString[] str();publicPersonE p();

}

使用自定义注解:

@MyAnnotation(show = "quan",age = 12,str = {"quan","zhi"},p=PersonE.p1)public voiddemo(){

}

元注解

用于描述注解的注解:

6877a8c5fd6e9cf73d73d18fcc6f08a0.png

Target

/*ElementType的取值

TYPE:可以作用类上

METHOD:可以作用方法上

FIELD:可以作用与成员变量上*/

bf1e36c072530a5df49392dc7aeee4f2.png

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示该MyAnnoT注解只能作用与类上

public @interfaceMyAnnoT {

}

Retention

4ad16f80bc99e390aaa85930558fc3ca.png

返回值时枚举类:

3c612e2ccd08b53fd42ad2376de17b64.png

/*@Retention(RetentionPolicy.RUNTIME )当前白描述的注解,会保留到class字节码文件中国,并被JVM读取到*/

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示该MyAnnoT注解只能作用与类上

@Retention(RetentionPolicy.RUNTIME )public @interfaceMyAnnoT {

}

Documented

@Documented//表示,未来会集合到javadoc文档种

Inherited

@Inherited//表示是否会被继承

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示该MyAnnoT注解只能作用与类上

@Retention(RetentionPolicy.RUNTIME )

@Documented//表示,未来会集合到javadoc文档种

@Inherited//表示是否会被继承

public @interfaceMyAnnoT {

}

在程序中实际应用注解,解析注解

获取注解中定义中的属性值

f64f8efc8a8f5e2833c4bfc276076cf9.png

定义一个注解:

/*** 描述需要执行的类名和方法名*/@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)public @interfacePro {

String className();

String methodName();

}/*public class ProImpl implements Pro{

String className(){

return "annotaion.Demo1";

}

String methodName(){

retun "show";

}

}

定义一个类:

packageannotaion;public classDemo1 {public voidshow(){

System.out.println("demo1..show...");

}

}

定义一个使用注解的累

@Pro(className = "annotaion.Demo1",methodName = "show")public classReflectTest {public static void main(String[] args) throwsException {/*不能改变框架的任何代码

可以创建任意类的对象,可以执行任意方法*/

//111解析注解:获取该类的字节码文件对象

Class reflectTestClass = ReflectTest.class;//222获取上边的注解//其实上面就是在内存中生成一个该注解接口子类实现对象

Pro an = reflectTestClass.getAnnotation(Pro.class);/*public class ProImpl implements Pro{

String className(){

return "annotaion.Demo1";

}

String methodName(){

retun "show";

}

}*/

//333调用注解对象中的抽象方法,获取放回值

String className =an.className();

String methodName=an.methodName();//利用Class的静态方法forName,传入全类名去获取指定类的Class对象

Class cls =Class.forName(className);

System.out.println(cls);//class annotaion.Demo1//通过Class对象的newInstance去实现无参实体类

Demo1 obj1 = (Demo1) cls.newInstance();//这里使用类的强制转换

obj1.show();

System.out.println(obj1);//annotaion.Demo1@61bbe9ba

Object obj= cls.newInstance();//因为这里使用Object接受,多态。

System.out.println(obj);//annotaion.Demo1@61bbe9ba//通过Class对象去获取类的方法

Method method =cls.getMethod(methodName);

System.out.println(method);//public void annotaion.Demo1.show()//执行方法,指定执行的实体类

method.invoke(obj);

}

}

re:

classannotaion.Demo1

demo1..show...

annotaion.Demo1@61bbe9ba

annotaion.Demo1@610455d6public voidannotaion.Demo1.show()

demo1..show...

计算器检测bug案例

需要测试下面这个计算器有没有bug

packageannotationDemo;public classCalulator {

@Checkpublic voidadd(){

String str= null;

str.toString();

System.out.println("1 + 0 = " +(1 + 0));

}

@Checkpublic voidsub(){

System.out.println("1 - 0 = " + (1 - 0));

}

@Checkpublic voidmul(){

System.out.println("1 * 0 = " + (1 * 0));

}

@Checkpublic voiddiv(){

System.out.println("1 / 0 = " + (1 / 0));

}public voidshow(){

System.out.println("no bug");

}

}

定义一个注解去实现:

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)public @interfaceCheck {

}

程序中利用注解:

importjava.io.BufferedOutputStream;importjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;/*** 简单测试

* 主方法执行,会制动执行被加了注解的方法,判断方法是否有异常

* 将异常记录到文件当中*/

public classTestCheck {public static void main(String[] args) throwsIOException {//实体类

Calulator c = newCalulator();//2获取字节码文件对象

Class cls =c.getClass();//3获取所有方法

Method[] methods =cls.getMethods();int number = 0;//出现异常的次数//异常记录数据

BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));//4判断方法中是否有Check注释

for(Method method : methods) {if(method.isAnnotationPresent(Check.class)){try{

method.invoke(c);

}catch(Exception e) {//6捕获异常

number++;

bw.write(method.getName()+ "方法出异常了");

bw.newLine();

bw.write("异常名称: " +e.getCause().getClass().getSimpleName());

bw.newLine();

bw.write("异常原因: " +e.getCause().getMessage());

bw.newLine();

bw.write("~~~~~~~~~~~~~~~~~~~~~");

bw.newLine();//记录到文件里面

}

}

}

bw.write("一共 " + number + "个异常");

bw.flush();

bw.close();

}

}

结果生成的bug.txt

7cb0a7f563e2dc9270610eb2a544a859.png

066341335c45f8563c50171ef2740233.png

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

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

相关文章

linux删除文件_Linux删除文件夹用什么命令

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要讲解Linux删除文件夹或目录的命令rmdir和rm的使用方法。Windows上的文件夹与Linux系统里的目录是同一概念。默认情况下&…

shrio 登陆后 还是失效_在 iPhone 上取消订阅后,应用或内容会立即失效吗?

在 iPhone 中,一些应用和服务需要进行订阅,即您需要支付相应的费用以获得应用或服务中内容的访问权限。如果您想要取消订阅某个项目,可以按以下步骤操作:前往 iPhone “设置”-“Apple ID”-“iTunes Store 与 App Store”&#x…

wifi 信道_WiFi网速太慢,四招就可以让无线网络变得顺畅

和WIFI网速相关联的因素主要有四个,对应解决方法也就有四个。频段冲突是WIFI网速变慢很常见的问题。现实中常用的WIFI频段有2.4GHZ和5GHZ两个大频段,也好比两条高速公路。中国2.4GHZ频段里有11个信道,5GHZ有15个信道。多少个信道就好比有多少…

判读一个对象不为空_“人不为己,天诛地灭”的真实含义

“人不为己,天诛地灭”出自《佛说十善业道经》,其意思不是“一个人如果不为自己谋利益,就会遭到天地诛灭”,而是“一个人如果不修行自己的德行,那么就会为天地所不容”。“为”是修习、修炼、修行的意思,修…

c++opencv显示中文_OpenCV如何入门秘籍

OpenCV简介谈起入门,我们首先要搞明白OpenCV是什么?OpenCV的全称是Open Source Computer Vision Library,是一种计算机视觉库,主要用于处理摄像头采集的图像。既然说到了是一种库,就要聊聊这个库使用什么语言编写的。O…

安卓开发文档_鸿蒙2.0,HarmonyOS开发体验!

“没有人能够熄灭漫天星光”。在9月10日的华为2020开发者大会上,余承东掷地有声地说道。从去年开放的鸿蒙1.0,到今年的2.0。仅仅一年时间,华为就把基础设施全部搭建好。从之前的感知不强,到现在的触手可得,让果核这个半…

python字符串类型_Python3的字符串类型(疯狂Python)

先看一下本篇文章要讲的内容目录: 4.2 字符串入门String4.2.1 repr和字符串4.2.2 input和raw_input4.2.3 长字符串4.2.4 bytes4.2.5 字符串格式化4.2.6 Python自带两个帮助函数4.2.7 删除多余空白4.2.8 字符串的查找,替换4.2.9 字符串的分割,…

盘点苹果微信聊天记录恢复的3大常用方法!

微信聊天记录一旦被误删除或者意外丢失,那确实是一件麻烦的事情。如果只是丢失了文件、图片、视频等,那么重新让好友转发就行。 那如果是想恢复全部聊天记录呢?苹果微信聊天记录恢复有哪些方法?如果你还不知道正确的恢复方法&…

python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程。作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编程范式,例如过程式编程、函数式编程、面向对象编程&#xf…

android 打开系统相册_这5款常用Android手机自动化测试工具你要收藏

1、Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试&#xff…

php 替换某个字符,php中如何替换字符串中的某个字符-PHP问题

正在PHP中,能够应用strtr()函数完成字符串交换。起首咱们简略理解下strtr()函数的界说及语法。语法:string strtr( string $str, string $from, string $to)第一个参数示意待转换的字符串。第二个参数示意字符串中与将要被转换的目的字符 to 绝对应的源字…

python提示对话框自动关闭_Python实现定时自动关闭的tkinter窗口方法

Python实现定时自动关闭的tkinter窗口方法 更新时间:2019年02月16日 09:13:27 作者:Python_小屋 今天小编就为大家分享一篇Python实现定时自动关闭的tkinter窗口方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看…

x5内核有什么优点_接上U盘就是NAS私有云,蒲公英X5入手测评

接上U盘就是NAS私有云,蒲公英X5入手测评!现在很多人喜欢在家里配置一台NAS,这样远程访问家里的数据不仅方便,而且可以即时备份PC以及手机等设备的数据。一旦手机丢失或电脑数据损坏,还可以通过NAS来恢复数据。但是对于…

小程序如何调用php程序,微信小程序调用PHP后台接口 解析纯html文本

搜索热词1、微信js动态传参:PHP/Home/Xiaoxxf/activity_detail?a_idoptions.id,//含富文本htmldata: {is_detail:1},method: GET,// OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECTheader: {Content-Type: application/json},success: function (res) {that.setD…

手机联系人头像包_一组抖音上很火的表情包,这里都有,一起来可可爱爱吧

我是最新抖音表情包马上到表情包轿车带火花|马上到表情包白色汽车动图em..不知道为什么这个表情包也很火,感jio没什么特别,这个就厉害了,你以为我是雨伞?那你就错了。砰~可可爱爱!太萌了。像不像考试中的你&#xff1f…

python视频处理代码_python如何实现视频转代码视频

本文实例为大家分享了python如何实现视频转代码视频的具体代码,供大家参考,具体内容如下 # -*- coding:utf-8 -*- #coding:utf-8 import argparse import os import cv2 import subprocess from cv2 import VideoWriter, VideoWriter_fourcc, imread, re…

遵义大数据中心项目工程概况_中策大数据:8月建筑工程项目有哪些?建筑工程项目信息汇总...

2020年8月建筑工程项目有哪些?中策大数据中国工程网为你搜集整理出了建筑工程项目信息,包括项目环评、施工单位招标、施工建设、项目设计、立项审批等各个工程项目阶段的拟在建项目。2020年8月建筑工程项目信息汇总:山东省济南温泉城通用航空…

php什么程度算学会,十天学会PHP - 序1,学会的标准是什么?(20180820-1)

学会的标准是什么十天学会,这种名称难免给人“浮躁”之感,所以要和大家稍作解释。很多同学认为,学会 达到目的,这个看法过于主观,比如想就业、创业、做毕业设计,他们所需要的专业知识差异很大,…

空间皮肤代码_不废话,看我20行代码搞定色块提取与定位…….

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题来由这个问题是谁问我的我已经不记得了,刚开始的时候他发了这张图像给我,让我给他看一下,我当时告诉他转换一下色彩空间提取就好啦&#xff0…

python字符串怎么表示_python中字符串的几种表达方式(用什么方式表示字符串)...

原博文 2018-11-21 18:45 − 说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式。 python的几种表达方式 1 使用单引号扩起来字符串 >>> my python lession #以单引号将字符串扩...0…