【面试加分项】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的源代码审核还没过。须要源代码的能够在评论中留邮箱,我会尽快发过去。

原文地址:https://www.cnblogs.com/llguanli/p/8505027.html

时间: 2024-08-01 09:25:29

【面试加分项】java自己定义注解之解析注解的相关文章

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

我之前的博客中说明过自定义注解的声明今天我们来看看如何对我们自己定义的注解进行使用. 1.我们在程序中使用我们的注解. 上一篇中我们自定义了一个注解: @Target(ElementType.FIELD)//注解的作用范围,就是注解是用在什么地方的 @Retention(RetentionPolicy.RUNTIME)//注解的级别,就是注解能留存到什么时候 @Documented @Inherited public @interface MyAnnotation { public String

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

之前的博客http://blog.csdn.net/u010590685/article/details/47029447介绍了java的注解的基本知识今天我们学习如何使用自定义注解. 首先我们要声明一个注解,声明代码如下: import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.

【面试加分项】java异常处理之try_catch_finally

try_catch_finally大家应该用的很多,不少人也了解一些他们的执行顺序,可是它真的有这么简单么,下面我们先来看一段代码,大家想想他的执行结果是什么? public class TestException { int goabl=1; public TestException() { } int testEx() throws Exception { int ret = 1; try { ret++; return ret; } catch (Exception e) { ret++;

@Aspect 注解切面解析

注解切面解析 注解切面解析器 /** * 注解切面解析器 */ public class BeanFactoryAspectJAdvisorsBuilder { /** * Bean 工厂 */ private final ListableBeanFactory beanFactory; /** * 生成 Advisor 的工厂 */ private final AspectJAdvisorFactory advisorFactory; /** * 切面 Bean 名称 */ @Nullable

Java注解全面解析

1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(RetentionPolicy.RUNTIME) public @interface Test {} 除了@符号以外,@Test的定义很像一个空的接口.定义注解时,需要一些元注解(meta-annotation),如@Target和@Retention @Target用来定义注解将应用于什么地方(如一个方法或者一个

Java注解全面解析(转)

1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(RetentionPolicy.RUNTIME) public @interface Test {} 除了@符号以外,@Test的定义很像一个空的接口.定义注解时,需要一些元注解(meta-annotation),如@Target和@Retention @Target用来定义注解将应用于什么地方(如一个方法或者一个

面试中关于Java你所需知道的的一切

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false.这个数据类型表示1 bit的信息,但是它的大小并没有精确定义. <Java虚拟机规范>中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持.在Java虚拟机中没有任何供

java 自定义注解以及获得注解的值

1.自定义注解 import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Inherited @Retention(RetentionPolicy.RUNTIME ) public @interface MyAnno { /** * 是否能为null * @return */ boolean isCanNull() default true; /** * 是否能为空字符串 * @return */ boolean

面试中关于Java中涉及到知识点(转)

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false.这个数据类型表示1 bit的信息,但是它的大小并没有精确定义. <Java虚拟机规范>中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持.在Java虚拟机中没有任何供