【面试加分项】java自定义注解之解析注解

我之前的博客中说明过自定义注解的声明今天我们来看看如何对我们自己定义的注解进行使用。

1.我们在程序中使用我们的注解。

上一篇中我们自定义了一个注解:

@Target(ElementType.FIELD)//注解的作用范围,就是注解是用在什么地方的
@Retention(RetentionPolicy.RUNTIME)//注解的级别,就是注解能留存到什么时候
@Documented
@Inherited
public @interface MyAnnotation {
    public String value();//注解可以接收的参数
}

这个注解只有一个参数,所以我们在使用时不需要显示说明参数名称。下面我们写一个类并使用注解。


public class People {
    @MyAnnotation("liu")
    private String name;
    public People() {
        Inject.injectfeild(this);
    }
    public String getName(){
        return name;
    }
}

大家可以看到我们写了一个类,并在他的上面写了一个我们的注解,假设我们现在要实现的功能是把注解中的值赋值给下面的属性name,那我们该怎么做呢。在这里我们可以看到我们在构造方法中调用了Inject.injectfeild(this),这个方法就是我们对注解进行解析,接下来我们就来看看具体是如何做的。

2.对注解进行解析

废话不多说先上代码:

public class Inject {
    public static void injectfeild(Object o){
         Class clazz = o.getClass();  //获得传进来的类
         Field[] fields = clazz.getDeclaredFields();//通过反射获取类的域(全局变量)
         for (Field field : fields) { 
            // 查看这个字段是否有我们自定义的注解类标志的  
             if (field.isAnnotationPresent(MyAnnotation.class)) {  
                 MyAnnotation inject = field.getAnnotation(MyAnnotation.class);  //获取到我们的注解
                 String value=inject.value();//获取注解的参数
                 field.setAccessible(true);
                 try {
                    field.set(o, value);//为我们的字段赋值
                } catch (IllegalArgumentException | IllegalAccessException e) {

                    e.printStackTrace();
                }
             }
         }
    }
}

其实我们就是通过反射获取了注解的值和对应的字段,在对他进行赋值。下面我们再来看看测试:

public class Test {

    public static void main(String[] args) {
        People people=new People();
        System.out.println(people.getName());
    }

}

结果:
liu

当然通常情况下一个普通的类的字段赋值我们可以直接给他一个set函数,这个例子只是然大家理解如何进行自定义注解。但是在许多框架中他们的属性都是这样进行赋值,原因是为了解耦,有兴趣的可以学习一下ioc的相关知识。
由于上传到csdn的源码审核还没过,需要源码的可以在评论中留邮箱,我会尽快发过去。

你可能感兴趣的:(java,java,面试,自定义注解)