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

版权声明:本文为博主原创文章,转载请注明来源

时间: 2024-07-29 08:38:08

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

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

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

java自定义Annotation,得到注解类中Annotation设定的注解值

java注解机制在各大框架中应用普遍,注解中可以设置一些值,如何得到呢. 要得到注解类中Annotation设定的注解值 即:遍历自定义Annotation中的方法,反射执行方法,结果就是 对应的注解值. java代码例子: package com.doctor.spring.core; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotat

【面试加分项】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魔法堂:自定义和解析注解

一.前言 注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作. 二.自定义注解 只需通过 关键字@interface 即可自定义注解 // 标识注解(就是无属性的注解) public @interface AnnotationWithoutProperty{ } //

java自定义注解学习(二)_注解详解

上篇文章,我们简单的实现了一个自定义注解,相信大家对自定义注解有了个简单的认识,这篇,这样介绍下注解中的元注解和内值注解 整体图示 内置注解 @Override 重写覆盖 这个注解大家应该经常用到,主要在子类重写父类的方法,比如toString()方法 package com.kevin.demo; public class Demo1 { @Override public String toString(){ return "demo1"; } } @Deprecated 过时 @D

转!java自定义注解

转自:http://blog.csdn.net/yixiaogang109/article/details/7328466  Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention

Java注解全面解析(转)

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