注解的反射,以及常见内置注解,反射注解

注解的反射,以及常见内置注解

注解的目的:

  • 在编写程序过程中,我们会编写注释,但是注释在程序运行过程中,注释是不会显示的,但是使用注解后,程序运行的过程中也会显示出来

自定义注解:

语法结构:
public @interface MyAnnotation{

}
使用时,直接@MyAnnotation

自定义注释成员属性
语法结构:
public @interface MyAnnotation{
String value();String成员变量,value成员名字 后面必须加括号
Class type();
}
使用时,@MyAnnotation(value=“xxx”,type = Object.class)

如果嫌麻烦的话可以使用成员属性默认值
语法结构:
public @interface MyAnnotation{
String value()default “默认值”;
Class type()default void.class;
}
使用时直接 @MyAnnotation

@MyAnnotation(type = Object.class, value = "XXX")//自定义注释
@MyAnnotation

常见内置注解

首先解释一下元注解:元注解就是其他注解的注解(就是一个注释的注释)
1.@Decumented 指示某一类型的注解通过 java doc 和类似默认工具进行文档化
2.@Inherited 指示注释类型被自动继承
3.@Retention 指示注释类型的注释要保留多久
4.@Target 指示注释类型所适用的程序元素的种类
主要掌握后两种
1.Retention:
适用的枚举:RetentionPolicy
1.SOURCE :不编译Annotation到类文件中
2.CLASS :编译Annotation到类文件中,运行时不加载
3.RUNTIME :在运行时加载到JVM中

2.Target
适用的枚举:ElementPolicy
1.ANNOTATION_TYPE :用于Annotation类型
2.TYPE :用于类,接口和枚举,以及Annotation类型
3.CONSTRUCTOR :用于构造方法
4.FIELD :用于成员变量和枚举常量(常用)
5.METHOD :用于方法(常用)
6.PARAMETER :用于参数
7.LOCAL_VARIABLE :用于局部变量
8.PACKAGE :用于包

反射注解:

Constructor(构造方法类)
Field(成员属性类)
Method(成员方法类)
这三个类都提供了三个方法
1.isAnnotationPresent(Class annotationClass) 查看是否添加了指定类型的annotation 有则ture
2.getAnnotation(Class annotationClass) 用来获取指定类型的annotation 不存在则null
3.getParameterAnnotations() 获取所有的注解的数组(将所有注解都返回出来,形成一个数组
注意:如果要返回类中的注解,有一个前提:@Retention(RetentionPolicy.RUNTIME)在运行时加载到JVM中

实例:
**主函数:**

public class 反射注解 {
	@MyAnnotation02(remark="手机品牌")
	public String phone;//手机品牌
	@MyAnnotation02(remark="手机价格")
	public double price;//手机价格
	@Deprecated//注解停用
	@MyAnnotation02(remark="电池型号",inable=false)//注解不启用
	public String batter;//电池型号
	@MyAnnotation02(remark="手机厂商")
	public String proudced;//手机厂商
}

**注解部分**

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)//此注解只可以用于成员属性上
@Retention(RetentionPolicy.RUNTIME)//反射的前提条件,此注解可以被反射
public @interface MyAnnotation02 {
	String remark() default "";
	boolean inable() default true;
}

反射部分
import java.lang.reflect.Field;

//反射注解,具体操作

public class demo {
	public static void main(String[] args) {
		Class c = 反射注解.class;
		Field fs[] = c.getDeclaredFields();//获取所有的属性
		for(Field f :fs) {
			if(f.isAnnotationPresent(MyAnnotation02.class));{//查看是否添加指定类型的注解,有就返回ture
//				System.out.println(f.getName()+"被注解过");
				MyAnnotation02 p =f.getAnnotation(MyAnnotation02.class);//获取MyAnnotation02的对象
				System.out.print(f.getName()+"注解的内容");
				System.out.print("备注:"+p.remark());//获取注解内容
				System.out.println("属性是否有效:"+p.inable());//获取注解是否有效
			}
		}
	}
}

结果如下:
phone注解的内容备注:手机品牌属性是否有效:true
price注解的内容备注:手机价格属性是否有效:true
batter注解的内容备注:电池型号属性是否有效:false
proudced注解的内容备注:手机厂商属性是否有效:true

发布了20 篇原创文章 · 获赞 13 · 访问量 2007

猜你喜欢

转载自blog.csdn.net/qq_42724864/article/details/104451700
今日推荐