Java Annotation注解、自定义注解 以及注解在方法上的运用【注解 & 注释 的区别】

1.常用注解

1.1@override

标记方法是否重写父类的方法,不是方法重写则报错

1.2@Deprecated

若某类或某方法加上@Deprecated注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用

1.2.1为什么需要标记而不删除不建议方法
  • 因为在一个项目中,工程比较大,代码比较多,而在后续开发过程中,可能之前的某个方法实现的并不是很合理,这个时候就要新加一个方法,而之前的方法又不能随便删除,因为可能在别的地方有调用它,所以加上这个注解,就方便以后开发人员的方法调用了。

1.3@SuppressWarnings

取消显示指定的编译器警告

1.4@FunctionalInterface

标记函数式接口:在JDK1.8新增的注解,规定一个接口只能有一个抽象方法

2.自定义注解

注解的主要组成: Annotation.java ElementType.java RetentionPolicy.java 这三个类

2.1@Retention

注解的生命周期

说明
CLASS编译器将把注释记录在类文件中,但在运行时 JVM 不保留注释
RUNTIME编译器将把注释记录在类文件中,在运行时 JVM将保留注释,因此可以反射性地读取
SOURCE编译器丢弃的注释
@Retention(RetentionPolicy.RUNTIME)

在这里插入图片描述

2.2@Target

注解的使用范围

说明
ANNOTATION_TYPE注释类型声明
CONSTRUCTOR构造方法声明
FIELD字段声明(包括枚举常量)
LOCAL_VARIABLE局部变量声明
METHOD方法声明
PACKAGE包声明
PARAMETER参数声明
TYPE类、接口(包括注释类型)或枚举声明
@Target({ElementType.FIELD,ElementType.METHOD}) 

2.3注解格式

@interface:注解的定义

public @interface 注解名称{
	// 属性 
}

2.4Demo:注解作用于方法上

  • 自定义注解MyAnnotion
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)  // 注解的生命周期 

//多个使用范围时,需要添加{} (e.g. : ({a, b})
@Target({ElementType.FIELD,ElementType.METHOD})  // 注解的使用范围
public @interface MyAnnotion {

	// 添加属性  数据类型 属性名称(); 
	// 可以把注解 使用类 或者方法 或者 属性上面 通过反射拿到注解信息 
	String value();
}
  • 使用注解创建Person类
public class Person {

	//使用注解给属性使用 
	@MyAnnotion02(value = "马化腾")
	private String name;
	@MyAnnotion02(value = "企鹅说:你这个充钱就可以解决")
	private String info;
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", info=" + info + "]";
	}
	
	//通过反射可以把注解值赋值 给(属性)对象   
	
}
  • 获取注解信息,把注解信息的值通过反射赋值给对象
import java.lang.reflect.Field;

public class Demo04 {

	public static void main(String[] args) throws Exception {
		
		// 获取注解信息,把注解信息的值通过反射赋值给对象 

		// 1.拿到对象的class对象 
		Class<Person> clazz = (Class<Person>) Class.forName("cn.szsxt.demo02.Person");
		
		Person p = clazz.newInstance();
		// 2. 通过反射拿到属性 
		
		Field[] fs = clazz.getDeclaredFields();
		// 3.拿到注解 
		for (Field f : fs) {
			
			// 先判断f是否有注解 
			// 判断属性是否有MyAnnotion02注解
            //isAnnotationPresent()判断是否有注解
			if (f.isAnnotationPresent(MyAnnotion02.class)) {
				
				// 通过属性使用方法:getAnnotation()获取注解 
				MyAnnotion02 annotation = f.getAnnotation(MyAnnotion02.class);
				// 4.获取注解值 
				String value = annotation.value();
				System.out.println("注解值:" +value);
				
				// 跳过安全检测(暴力破解) 
				f.setAccessible(true);
				
				// 5.通过反射把注解值赋值给属性  
                f.set(p, value);
			}
		}

		System.out.println(p);
	}
}

注解 & 注释 的区别

注解Annotation注释
定义JDK5.0引入的特性
与类、接口、枚举是在同一个层次
注解是源代码的元数据
它是一种描述数据的数据
对源代码作介绍、评议或说明的文字
作用用于反馈信息给JVM
标记包、类、字段、方法、局部变量、方法参数等元素据
反馈信息给人看
告诉开发者这段代码的逻辑、说明、特点等内容
对代码起到解释、说明的作用
使用范围参与代码编译,以@开头的,与工具一起使用。
对于位置、语法、内容有一定的限制
随意在任务位置填写内容,对代码任何没有影响
运行过程JVM读取,并进行相应操作,反馈被标元素的注解JVM忽略
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java自定义元注解通常用于对注解进行注释和描述,其使用方法如下: 1. 定义一个注解,使用@Target、@Retention、@Documented三个元注解注解进行描述。 2. 使用@Inherited元注解,表示注解可以被继承。 3. 在需要使用注解的类、方法、属性等上面使用定义的注解,通过反射获取注解信息。 示例代码如下: @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface CustomAnnotation { String value() default ""; } 在需要使用注解的类、方法、属性等上面使用定义的注解: @CustomAnnotation(value = "这是一个自定义注解") public class Test { @CustomAnnotation(value = "这是一个字段注解") private String name; @CustomAnnotation(value = "这是一个方法注解") public void sayHello() { System.out.println("Hello World!"); } } 通过反射获取注解信息: Class testClass = Test.class; CustomAnnotation annotation1 = (CustomAnnotation) testClass.getAnnotation(CustomAnnotation.class); System.out.println(annotation1.value()); // 输出 "这是一个自定义注解" Field nameField = testClass.getDeclaredField("name"); CustomAnnotation annotation2 = nameField.getAnnotation(CustomAnnotation.class); System.out.println(annotation2.value()); // 输出 "这是一个字段注解" Method sayHelloMethod = testClass.getDeclaredMethod("sayHello"); CustomAnnotation annotation3 = sayHelloMethod.getAnnotation(CustomAnnotation.class); System.out.println(annotation3.value()); // 输出 "这是一个方法注解"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值