java注解看这一篇就够了

yZzc_XQ      2022-05-08     611

关键词:

注解

1.概念

注解:说明程序的。给计算机看的

注释:用文字描述程序的。给程序员看的

注解的定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

2.作用

①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】:

​ shift+右键 -> 在此处打开Powershell窗口 -> 输入:javadoc .\类名.java

②代码分析:通过代码里标识的注解对代码进行分析【使用反射】

③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

3.Java 的三大注解

1.@Override:表明子类中覆盖了超类中的某个方法,如果写错了覆盖形式,编译器会报错

2.@deprecated:废弃的(过时的)表明不希望别人在以后使用这个类,方法,变量等.

3.@suppresswarnings:抑制警告

​ 达到抑制编译器产生警告的目的,但是不很不建议使用,因为后期编码人员看不懂编译器 提示的警告,不能更好的选择更好的类去完成任务。

​ 一般传递参数:all @SuppressWarnings("all") 可以加在类的上面一行,这样代码就 没有警告了,显得比较干净。

4.自定义注解:

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

​ public interface MyAnno extends java.lang.annotation.Annotation {}

​ 可以在Powershell窗口反编译看看:

格式:

public @interface 注解名称{
/* 属性列表;
 * 注解中的属性 主要定义抽象方法 不定义常量
 * 抽象方法的返回值类型有要求():
 * 		1.基本数据类型
 * 		2.String
 * 		3.枚举类型
 * 		4.注解
 * 		5.数组(以上几种类型的数组)
 */
}
//属性列表中抽象方法的举例:
public @interface MyAnno {
	
	 int getName();
	  
	 String getStr();
	  
	 Season getSeason();   //新建Enum枚举类Season
	  
	 MyAnno2 getMyAnno2();	//新建Annotation注解类MyAnno2
	
	String[] value();
	
	//int getName() default 0;  //如果不想为注解中的某个属性赋值,可以为其定义默认值

}
//枚举类
public enum Season {
	SPRING,SUMMER,AUTUMN,WINtER
}

注解类定义了属性,那么在使用时必须给属性赋值。

/*
1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。int getName() default 0;
	@MyAnno()
	public static void  test02() {}
2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。

3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略。
*/
//对我们自定义的MyAnno注解类的使用:
@MyAnno(getName = 1, getStr = "100", getSeason = Season.SPRING, getMyAnno2= @MyAnno2,value = {"1","2"})
public static void  test01() {}

元注解:用于描述注解的注解(注解前面的注解)

@Target:描述注解能够作用的位置
	ElementType取值:
		TYPE:可以作用于类上
         FIELD:可以作用于成员变量上
		METHOD:可以作用于方法上
@Retention:描述注解被保留的阶段
	SOURCE:	源代码阶段, 被编译器忽略
	CLASS:  注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行为,所有没			有用Retention注解的注解,都会采用这种策略。
	RUNTIME:保留至运行时。所以我们可以通过反射去获取注解信息。
	@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
//下面两个了解
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承

对Java的三大注解之一的SuppressWarnings注解进行分析:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();      //只有一个属性,且名称为value,且为数组赋值
}
@SuppressWarnings(value={"all"})	
public class AnnoTest {}
//同样可以这么使用
@SuppressWarnings({"all"})	//使用时可以省略value
@SuppressWarnings("all")	//使用时可以省略{}

5.注解的使用

注解的作用:将我们为注解中的属性(抽象方法)赋的值提取出来,在类中使用

  1. 获取注解定义的位置的对象 (Class,Field,Method)

  2. 获取指定的注解:

    getAnnotation(Class annotationClass):方法返回该元素的指定类型的注释,如果是这样的注释,否则返回null

    ​ 参数:annotationClass -- 对应于注释类型的Class对象。

6.案例

1.定义该类使用注解加反射,实现不修改任何代码(只需要修改注解中的值),就可以实现调用任意类中的任意方法

//自定义注解类
@Retention(RUNTIME)
@Target(TYPE)
public @interface Pro {
	
	String className();   //通过该属性获取到类名
	String methodName();   //通过该属性获取到方法名

}
@SuppressWarnings("all")
@Pro(className = "com.huike.b.useanno.Demo2", methodName = "show")
public class AnnoTest {
	
	public static void main(String[] args) throws Exception {
		
		//1.解析注解
		//1.1:获取加注解的类的字节码文件对象
		//1.2:获取注解对象
		Class cls = AnnoTest.class;
		
		//通过当前类的Class对象获取到类上的注解对象
		Pro pro = (Pro) cls.getAnnotation(Pro.class);
		
		
		//2.调用注解中的抽象方法  获取到返回值
		String className = pro.className();
		String methodName = pro.methodName();
		
		//3.获取到返回值所对应的类的Class对象
		Class cls1 = Class.forName(className);	
		
		//4.创建该类的对象
		Object object = cls1.newInstance();
		
		//5.获取到该类的特定方法对象
		Method method = cls1.getMethod(methodName);
		
		//6.执行方法
		method.invoke(object);
		
	}
}

2.测试框架:

  •  当main方法执行后,会自动执行被检测的所有方法(被加了Check注解的方法),判断方法内是否有异常
    
  •  如果没有就算了,如果有异常,会自动记录到特定的文件中,文件中记录哪些方法出异常了,异常的名称是什么异常的原因是什么   
    
  •  得出总结:本次共测试了多少方法,出现了多少次异常
    
//Check注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Check {
}
//自定义Calculator类,被用于测试
public class Calculator {
	
	//加法
	@Check
	public void add() {
		String str = null;
		str.toString();
		System.out.println("1 + 0="+(1 + 0));
	}
	
	//减法
	@Check
	public void sub() {
		System.out.println("1 - 0="+(1 - 0));
	}
	
	//乘法
	@Check
	public void mul() {
		System.out.println("1 * 0="+(1 * 0));
	}
	
	//除法
	@Check
	public void div() {
		System.out.println("1 / 0="+(1 / 0));
	}
	
	public void show() {
		System.out.println("永无bug...");
	}
	
}

//测试类
public class CheckDemo {
	
	public static void main(String[] args) throws Exception{
		
		//1.创建计算器对象 得到对应的Class对象
		Calculator c = new Calculator();
		Class cls = c.getClass();
		//2.获取到该对象中的所有的方法
		Method[] methods = cls.getDeclaredMethods();
		
		int num01 = 0;  //定义一个int类型的值用于记录出现的异常次数
		int num02 = 0;  //定义一个int类型的值用于记录带有Check注解的方法数
		BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));
		
		//3.判断哪些方法上有Check注解
		for (Method method : methods) {
			
			//该方法用于判断 方法上是否有特定的注解
			//4.如果有Check注解,执行该方法 如果该方法无任何异常,就算了
			if (method.isAnnotationPresent(Check.class)) {
				num02++;
				try {
					method.invoke(c);   //如果有注解,则执行该方法
				} catch (Exception e) {
					num01++;
					//5.如果有异常,记录异常信息,并通过IO流打印到文件中
					//如果方法存在异常 需要在此通过IO流捕获
					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("本次测试结束了,一共测试了"+num02+"个方法,共出现了"+num01+"次异常!");
		bw.flush();
		bw.close();
		
	}
}

java中的多线程你只要看这一篇就够了

 https://www.cnblogs.com/wxd0108/p/5479442.html  查看详情

java集合,看这一篇就够了

Java集合是java.util下特别有用的工具类,大致分为2个系列:Collection接;口和Map接口派生的。按体系分,则分为四种1. List:有序重复的集合;2.Set:无序不重复的集合3.Map:有映射关系的集合(key-value)4.Queue:代表队列集合的实现(JDK5... 查看详情

json入门看这一篇就够了

什么是JSONJSON:JavaScriptObjectNotation【JavaScript对象表示法】JSON是存储和交换文本信息的语法。类似XML。JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S为什么需要JSON提到JSON,我们就应该和XML来进行对... 查看详情

java集合看这一篇就够了

大家好,这里是《齐姐聊数据结构》系列之大集合。话不多说,直接上图:Java集合,也称作容器,主要是由两大接口(Interface)派生出来的:Collection和Map顾名思义,容器就是用来存放数据的。那么这两大接口的不同之处在于:Colle... 查看详情

java数组,看这一篇就够了

在Java泛型出现之前,只有数组可以用来存储指定类型的对象;在自动装箱机制出现之前,只有数组可以用来存储基本数据类型;也就是说,在泛型和自动装箱机制出现之前,数组在Java当中的分量举足轻重。况且数组还是一种效... 查看详情

json格式对象该怎么传?看这一篇就够了!

一、List<Map>一般会使用在SQL语句的返回结果上代码如下:@Query(value="selectuser_name,user_agefromsys_userwheredept_id=?,nativeQuery=true)List<Map>findUserInfoById(LongdeptId);根据部门的ID查 查看详情

[转]关于深度学习,看这一篇就够了

关于深度学习,看这一篇就够了原文地址:http://www.dlworld.cn/XueXiSuanFa/13.html[日期:2016-04-26]来源:36氪 作者:[字体:大 中 小]    编者按:本文作者王川,投资人,中科大少年班校友,现居加州硅谷,个人微信号... 查看详情

elasticsearch入门,看这一篇就够了(代码片段)

Elasticsearch入门,看这一篇就够了前言可视化工具kibanakibana的安装kibana配置kibana的启动Elasticsearch入门操作操作index创建index索引别名有什么用删除索引查询索引exist索引操作document插入document查询document删除document更新document使用... 查看详情

java培训,看这一篇就够了

Java培训机构怎么选?很多想要转行的人对于选择Java培训存在很多困惑。尤其是现在很多人都会面临两个选择,自学或者是报Java培训班。报班费用太高,时间不自由。自学不知道从哪里开始学,担心自己坚持不下... 查看详情

jdk11关于java模块系统,看这一篇就够了

继2014年3月Java8发布之后,时隔4年,2018年9月,Java11如期发布,其间间隔了Java9和Java10两个非LTS(LongTermSupport)版本。作为最新的LTS版本,相比Java8,Java11包含了模块系统、改用G1作为默认GC算法、反应式流Flow、新版HttpClient等诸多... 查看详情

javanio看这一篇就够了

原文链接:https://mp.weixin.qq.com/s/c9tkrokcDQR375kiwCeV9w?现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能。在前篇文章... 查看详情

逆转单向链表看这一篇就够了java(代码片段)

逆转单向链表逆转前:1->2->3->4->5->null逆转后:5->4->3->2->1->null个人博客地址:逆转单向链表方法一、循环迭代publicNodereverse(Nodehead)if(head==null||head.next==null)returnhead;//取前面节点Nodepre=head;//取后面 查看详情

jetpackworkmanager看这一篇就够了~

前言最近有读者反馈,在我的新书​​《AndroidJetpack开发:原理解析与应用实战》​​中并没有提及到WorkManager,这是因为目前这个东西在国内并不是很好用。最近因为工作需要正好研究了下,也作为补充章节分享给读者。什么... 查看详情

java中的多线程你只要看这一篇就够了

转自:https://www.cnblogs.com/wxd0108/p/5479442.html引如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以... 查看详情

handler看这一篇就够了(代码片段)

Handler使用首先来熟悉一下Handler的四种使用方式,如果比较熟悉可以直接跳过:通过sendMessage消息机制来发送sendEmptyMessage(int);//发送一个空的消息sendMessage(Message);//发送消息,消息中可以携带参数sendMessageAtTime(Message,long... 查看详情

最全排序算法及优化,看这一篇就够了(代码片段)

最全排序算法总结看这一篇就够了没有经过总结的知识是沉重的,无用的瞧一瞧~博健的LeetCode题解:Gitbook版本传送门博健的LeetCode题解:CSDN传送门有趣的CSS:Gitbook传送门前端进阶笔记:Gitbook传送门目录... 查看详情

java中的多线程你只要看这一篇就够了

引 如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一... 查看详情

关于反爬虫,看这一篇就够了

编者:本文来自携程酒店研发部研发经理崔广宇在第三期【携程技术微分享】上的分享,以下为整理的内容概要。墙裂建议点击视频回放,“现场”围观段子手攻城狮大崔,如何高智商&高情商地完美碾压爬虫。。。关... 查看详情