注解的反射,以及常见内置注解,反射注解
注解的反射,以及常见内置注解
注解的目的:
- 在编写程序过程中,我们会编写注释,但是注释在程序运行过程中,注释是不会显示的,但是使用注解后,程序运行的过程中也会显示出来
自定义注解:
语法结构:
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
还没有评论,来说两句吧...