首页 > 编程语言 >零基础学Java第二十四天之注解的理解与使用

零基础学Java第二十四天之注解的理解与使用

时间:2024-06-01 11:29:43浏览次数:25  
标签:lang aaa java public 第二十四 注解 Java annotation

注解

1、什么是注解

java.annotation包Annotation是从JDK1.5开始引入的新技术,注解即可以对程序员解释又可以对程序解释

2、注解与注释的区别

注释:对程序员解释代码信息注解:对程序和程序员解释代码信息

3、注解的所用

  1. 不是程序本身,可以对程序作出解释(与注释(comment)类似)2. 可以被其他程序(编译器)读取

4、注解的格式

注解是以“@注释名”在代码中存在的,还可以添加一些参数例如:@SuppressWarnings(value=“unchecked”)

5、注解的应用

可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制实现对这些数据的访问

6、内置注解

@Overrlde:定义在java.lang.Override中,此注解只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明

@Deprecated:定义在java.lang.Deprecated中.此注解可以用于修饰方法,属性,类。表示不鼓励使用这样的元素.通常是因为它很危险或者存在更好的选择

@SuppressWarnings:镇压警告,定义在java.lang.SuppressWarnings中用来抑制编译时的警告信息,与前两个注释有所不同.你需要添加参数才能正确使用。这些参数都是已经定义好了的.我们选择性的使用就好了

@SuppressWarnings(“all”)抑制所有类型的警告信息@SuppressWarnings(“unchecked”)抑制单类型的警告信息

@SuppressWarnings(value={“unchecked”,“deprecation”})抑制多类型的警告信息

7、元注解

元注解的作用:负责注解其他注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明这些类型和它们所支持的类在java.lang.annotation包中可以找到

(@Target,@Retention,@Documented,@Inherited )

*@Target*:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

*@**Retention*:表示需要要在什么级别保存该注择信息,用于描述注解的生命周期 (SOURCE < CLASS < *RUNTIME*)

@Document:说明该注解将被包含在javadoc中@lnherited:说明子类可以继承父类中的该注解

8、自定义注解

1、内置注解

package com.xx.annotate;
import java.util.ArrayList;
/**

 * 内置注解
 * @override--重写父类方法
 * @SuppressWarnings("all")镇压警告
 * @deprecated--弃用的注解
 * */
   public class Test01 {
   //弃用的注解
   @Deprecated
   public void method(){}
   //镇压警告
   @SuppressWarnings("all")
   public void method01(){
   	ArrayList list = new ArrayList();
   	list.add(100);
   	list.add(123.1234);
   }
   //重写父类方法
   @Override
   public String toString() {
   	return super.toString();
   }
}

2、自定义注解的用法一

  1. @Target(ElementType.METHOD)

    • @Target:这个元注解用于指定被修饰的注解可以应用于哪些Java元素上。
    • ElementType.METHOD:这是ElementType枚举的一个值,表示被修饰的注解只能应用于方法上。

    因此,这个@Target(ElementType.METHOD)意味着紧随其后的注解只能被应用于方法上。

  2. @Retention(RetentionPolicy.RUNTIME)

    • @Retention:这个元注解用于指定被修饰的注解的生命周期。
    • RetentionPolicy.RUNTIME:这是RetentionPolicy枚举的一个值,表示被修饰的注解在运行时仍然可见,可以被JVM读取。

    在Java中,注解有三种保留策略(Retention Policies):

    • SOURCE:注解只保留在源码中,编译时会被丢弃。
    • CLASS:注解被保留在class文件中,但JVM加载class文件时会忽略它。
    • RUNTIME:注解被保留在class文件中,且可以在运行时通过反射机制被读取。

    因此,@Retention(RetentionPolicy.RUNTIME)意味着紧随其后的注解在运行时仍然可见,可以被JVM读取和使用。

1、注解
package com.xx.annotate02;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {

}
2、使用
package com.xx.annotate02;

public class Test01 {
	/**
	 * 
	 * 自定义注解
	 * 
	 * */
	@MyAnnotaction
	public void method(){}
}

3、自定义注解的用法二

1、注解
package com.xx.annotate03;

//静态导入,ElementType也是一个枚举类
import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
		//类,	属性,	构造方法,	  方法,	用于方法的参数
@Target({TYPE,FIELD,CONSTRUCTOR,METHOD,PARAMETER})
//用于指定被修饰的注解的生命周期。//运行时仍然可见
//RetentionPolicy枚举类
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
	String value();
}
2、使用
package com.xx.annotate03;
public class Test01 {
	/**
	 * 
	 * 自定义注解
	 * 根据我们写的注解可以应用在以下范围上
	 * 
	 * */
	@MyAnnotaction("aaa")
	//MyAnnotation 是一个注解,它有一个名为 value 的元素,该元素接受一个字符串值。
	//当您在 myMethod 方法上使用 @MyAnnotation("aaa") 时,
	//您正在为 value 元素提供字符串值 "aaa"。
	
	//写在方法上
	public void method(){
		
	}
	//写在无参构造上
	@MyAnnotaction("aaa")
	public Test01(){
		
	}
	//写在属性上
	@MyAnnotaction("aaa")
	String str;
	//写在参数上
	@MyAnnotaction("aaa")
	public void method02(@MyAnnotaction("aaa") int i) {
	}	
}

4、自定义注解的用法三

1、注解
package com.xx.annotate04;


//静态导入,ElementType也是一个枚举类
import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
		//可以应用于方法
@Target({METHOD})
//用于指定被修饰的注解的生命周期。//运行时仍然可见
//RetentionPolicy枚举类
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
	
	
	String value() default "abc";
}

2、使用
package com.xx.annotate04;

public class Test01 {
	/**
	 * 
	 * 自定义注解
	 * 根据我们写的注解可以应用在以下范围上
	 * 
	 * */
	//@MyAnnotaction("aaa")
	//MyAnnotation 是一个注解,它有一个名为 value 的元素,该元素接受一个字符串值。
	//当您在 myMethod 方法上使用 @MyAnnotation("aaa") 时,
	//您正在为 value 元素提供字符串值 "aaa"。
	
	//因为给了默认值,所以可以有以下写法
	//写在方法上
	//用value给值
	@MyAnnotaction(value="aaa")
	public void method02(){
		
	}	
	//给值
	@MyAnnotaction("aaa")
	public void method03(){
		
	}
	//不给值
	@MyAnnotaction()
	public void method04(){
		
	}
}

5、自定义注解的用法四

1、注解
package com.xx.annotate05;

//静态导入,ElementType也是一个枚举类
import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
		//可以应用于方法
@Target({METHOD})
//用于指定被修饰的注解的生命周期。//运行时仍然可见
//RetentionPolicy枚举类
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
	
	//注解多个
	String[] value();
}

2、使用
package com.xx.annotate05;

public class Test01 {
	/**
	 * 
	 * 自定义注解
	 * 根据我们写的注解可以应用在以下范围上
	 * 
	 * */
	//@MyAnnotaction("aaa")
	//MyAnnotation 是一个注解,它有一个名为 value 的元素,该元素接受一个字符串值。
	//当您在 myMethod 方法上使用 @MyAnnotation("aaa") 时,
	//您正在为 value 元素提供字符串值 "aaa"。
	
	//因为给了默认值,所以可以有以下写法
	//写在方法上
	//用value给值
	@MyAnnotaction(value="aaa")
	public void method02(){
		
	}	
	//给多个值,简易版
	@MyAnnotaction({"aaa","bbb","ccc"})
	public void method03(){
		
	}
	//给多个值,复杂版
	@MyAnnotaction(value={"aaa","bbb","ccc"})
	public void method04(){
		
	}
}

6、自定义注解的用法五

注解 MyAnnotaction 定义了一个名为 name 的元素,这个元素是一个字符串数组(String[])。这意味着当您使用这个注解时,需要为 name 元素提供一个或多个字符串值。

1、注解
package com.xx.annotate06;


//静态导入,ElementType也是一个枚举类
import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
		//可以应用于方法
@Target({METHOD})
//用于指定被修饰的注解的生命周期。//运行时仍然可见
//RetentionPolicy枚举类
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
	
	//用name注解多个
	String[] name();
}

2、使用
package com.xx.annotate06;

public class Test01 {
	/**
	 * 
	 * 自定义注解
	 * 根据我们写的注解可以应用在以下范围上
	 * 
	 * */
	//@MyAnnotaction("aaa")
	//MyAnnotation 是一个注解,它有一个名为 value 的元素,该元素接受一个字符串值。
	//当您在 myMethod 方法上使用 @MyAnnotation("aaa") 时,
	//您正在为 value 元素提供字符串值 "aaa"。
	
	//因为给了默认值,所以可以有以下写法
	//写在方法上
	//用value给值
	@MyAnnotaction(name="aaa")
	public void method02(){
		
	}	
	//给多个值
	@MyAnnotaction(name={"aaa","bbb","ccc"})
	public void method04(){
		
	}
}

7、自定义注解的用法六

1、注解
package com.xx.annotate07;


//静态导入,ElementType也是一个枚举类
import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
		//可以应用于方法
@Target({METHOD})
//用于指定被修饰的注解的生命周期。//运行时仍然可见
//RetentionPolicy枚举类
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaction {
	
	//用name注解,用info注释多个,并设置默认值
	String name();
	String[] info() default "xxx";
}

2、使用
package com.xx.annotate07;

public class Test01 {
	/**
	 * 
	 * 自定义注解
	 * 根据我们写的注解可以应用在以下范围上
	 * 
	 * */
	//@MyAnnotaction("aaa")
	//MyAnnotation 是一个注解,它有一个名为 value 的元素,该元素接受一个字符串值。
	//当您在 myMethod 方法上使用 @MyAnnotation("aaa") 时,
	//您正在为 value 元素提供字符串值 "aaa"。
	
	//因为给了默认值,所以可以有以下写法
	//写在方法上
	//用name和info给值
	@MyAnnotaction(name = "aaa",info="xxx")
	public void method01() {
	}
	//name赋值,info使用默认
	@MyAnnotaction(name = "aaa")
	public void method02() {
	}
}

标签:lang,aaa,java,public,第二十四,注解,Java,annotation
From: https://blog.csdn.net/qq_53720725/article/details/139234053

相关文章

  • 【html5期末大作业】基于HTML+CSS+JavaScript管理系统页面模板
    @TOC>......
  • Java数组
    Java数组1.数组概念数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们2.数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是......
  • python参数传递与Java参数传递的对比
    目录一、本文简介二、参数传递的类型三、python中参数传递的类型3.1可变对象与不可变对象3.2对象引用传递和引用传递的区别3.3如何理解python中列表的"+"操作和append操作的区别四、Java中参数传递的类型附录一、本文简介python参数传递的类型是“对象引用传递”......
  • 运用JavaScript代码,使用Three.js框架在网页中实现3D效果,零基础入门Three.js,包含具体实
    不经意间看到了某个大佬做的网站~实在是太帅啦!查了查实现该效果的技术——原来是Three.js如果你也感兴趣的话,那就让我们来从零开始学习Three.js动态3D效果吧✨一、了解Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使......
  • 【华为OD】D卷真题100分:分割数组的最大差值 Java代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、Java、python、C、C++代码实现:【华为OD】D卷真题100分:分割数组的最大差值JavaScript代码实现[思路+......
  • JAVAEE之文件IO_数据流概念,字节流:InputStream、OutputStream,字符流:reader、writer,及实
    什么是数据流 顾名思义,I表示input,O表示output,也就是输入输出流,主要是在程序与文件之间,用于传输数据的通道。既然要传输数据,那么我们需要理解文件和程序之间哪种方向的传输是输入流,哪种传输作为输出流?我们可以举一个例子,如下图所示: IO流是JavaIO中的核心概念。流......
  • 基于OJ的Java课程实验管理系统的设计与实现论文
    摘要课程实验网站是一个为课程提供全面、准确、及时课程实验的在线平台。它汇聚了各地的课程体验。该网站通过丰富的图片形式展示课程,让课程者提前感受到社区的乐趣。同时,它还提供了详细的课程攻略和实用建议,帮助课程者避免社区中的陷阱和误区,确保行程顺利。本课程实验......
  • [转帖]一次Java内存占用高的排查案例,解释了我对内存问题的所有疑问
     https://segmentfault.com/a/1190000044152595 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。问题现象7月25号,我们一服务的内存占用较高,约13G,容器总内存16G,占用约85%,触发了内存报警(阈值85%),而我们是按容器内存60%(9.6G)的比例配置的JVM堆内存......
  • java通过冒泡排序对数组进行排序
    冒泡排序是从列表第一个元素开始,比较相邻两个元素大小,小的排在前面,大的排后面,循环反复,小的数据会像气泡那样上浮。packageproject;publicclassMaopaopaixu{ publicstaticvoidmain(String[]args){ //冒泡排序 int[]arr={9,8,3,5,2}; for(inti=0;i<arr.le......
  • Java循环结构while
    1.while是最基本的循环,它的结构为        while(布尔表达式){            //循环内容                }2.只要布尔表达式为true,循环就会一直执行下去3.我们大多数情况是会让循环停止下来的,我们需要一个让表达式时......