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系统里的目录是同一概念。默认情况下&…

python opencv2_Python + OpenCV2 系列:2 - 图片操作

这些相当于我的学习笔记,所以并没有很强的结构性和很全的介绍,请见谅。1. 读取/写入图像下面是一个简短的载入图像、打印尺寸、转换格式及保存图像为.png的例子:#-*- coding: utf-8 -*-importcv2import numpy as np#读入图像im cv2.imread(.…

java core 生成路径_core文件生成和路径设置

在程序崩溃时,内核会生成一个core文件,即程序最后崩溃时的内存映像,和程序调试信息。 之后可以通过gdb,打开core文件察看程序崩溃时的堆栈信息,可以找出程序出错的代码所在文件和函数。1.core文件的生成开关和大小限制 1)使用ulimit -a命令&…

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

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

java可以返回微妙吗_Java开发中10个最为微妙的最佳编程实践

这是10个最佳实践的列表,比你平时在Josh Bloch的《effective java》中看到的规则更加精妙。和Josh Bloch列出的非常容易学习的、和日常情况息息相关的实践相比,这个列表中提到了一些关于设计API/SPI的实践,虽然不常见,但是存在很大…

python3.7输出语句_Day3-Python-Python字符串if语句学习-2018/7/18

1.什么是字符串a.使用单引号或者双引号括起来的字符集就是字符串。b.引号中单独的符号、数字、字母等叫字符c.转义字符:可以用来表示一些有特殊功能或是特殊意义的字符(通过在固定的字符前加反斜杠\)\->\\->\\n->换行\t->制表符\"->"在计算…

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

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

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

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

java https双向验证_java https双向认证证书

// 双向认证证书KeyStore keyStore KeyStore.getInstance(“PKCS12”);KeyStore trustStore KeyStore.getInstance(“jks”);// keyStore是服务端验证客户端的证书,trustStore是客户端的信任证书InputStream ksIn new FileInputStream(“E:/Java/jre8/lib/securi…

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

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

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

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

吉比特java开发_JVM 吉比特后台 Java 开发实习生 20 分钟一轮游 _好机友

吉比特后台 Java 开发实习生 20 分钟一轮游作者:胖若两人链接:https://www.nowcoder.com/discuss/155198?type2&order3&pos9&page1来源:牛客网关于在牛客前几天投的,就在今天早上,面了 20 分钟就结束了&a…

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大常用方法!

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

php 修改文件属性命令,php:修改目录下文档权限(777,644 )

php:修改目录下文档权限(777,644 )文章分类:PHP编程PHP chmod() 函数 (upload image permit)PHP Filesystem 函数定义和用法chmod() 函数改变文件模式。如果成功则返回 TRUE,否则返回 FALSE。语法chmod(file,mode)参数描述file必需。规定要检…

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

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

上传文件的php代码,PHP实现大文件上传源代码

PHP实现大文件上传源代码PHP 基础教程 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。 PHP 是免费的,并且使用广泛。 以下是小编为大家搜索整理的PHP实现大文件上传源代码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试!经…

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窗口方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看…