反射和注解的使用

反射和注解的使用

反射是java一个非常强大的特性,使用反射可以在代码运行时对代码进行分析检测和处理,是学习框架知识必须掌握的部分。注解在现在流行框架中的使用日益增多,这种约定优于契约的处理形式,使得代码变得简单和易于编写,其灵活性远远大于使用配置文件配置的方式。本文从一个简单的demo入手,来探索框架的根基。
此demo主要完成以下几点:
1. 定义自己的注解
2. 在示例类中使用我们自己的注解
3. 通过一个使用反射机制的类扫描示例类,对注解对内容进行处理

自定义注解

package chapter_10;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)//指明此注解的应用范围是方法之前
@Retention(RetentionPolicy.RUNTIME)//注解会被记录在class文件中,并在运行时被保留在vm中使得以反射方式读取
public @interface MyAnnotation {
    String source();
    int code();
    String act();
}

注解本质是个interface,前面用@标示,其定义的方法都是抽象方法。

使用自定义注解的简单类

package chapter_10;

public class AnnotationClazz {

    @MyAnnotation(source="this is method source",
                code=111,
                act="this is act")
    public void doSth(){

    }
}

处理注解内容的反射类

package chapter_10;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/** * 自定义了注解 Myannotation * 使用反射分析使用了注解的类的方法 * 打印出注解中注入的元素内容 * * 对注解的处理必须是明确的,即获得目标注解的对象实例 * * 那么获取一个方法的全部注解,再挨个处理,可不可行? * @author Cuber_Q * */
public class AnnotationUseDemo {
    public static void main(String[] args){
        try {
            Class clazz = Class.forName("chapter_10.AnnotationClazz");
            Method[] methods = clazz.getDeclaredMethods();
            for(Method method:methods){
                //get annotations, if the method has
                System.out.println("method name="+method.getName());
                MyAnnotation myAnno = 
                    method.getDeclaredAnnotation(MyAnnotation.class);
                if(null != myAnno){
                    System.out.println("source="+myAnno.source());
                    System.out.println("code="+myAnno.code());
                    System.out.println("act="+myAnno.act());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

先得到使用注解的类对象的class对象实例,通过此实例获得类中的方法,再获取到外我们的自定义注解。demo功能简单,只是将注解的内容打印出来。在实际应用中,这里就能做很多事情,比如springmvc框架中的声明一个类为Controller,绑定映射url 等等。

控制台输出

method name=doSth
source=this is method source
code=111
act=this is act

总结:

一直以来对注解和反射的原理充满好奇却不胜了解。通过看书和实际编码,似乎掌握了一些东西,但离实际应用这些技术还远远不够。只有通过不停的学习,才能进步。与君共勉!

你可能感兴趣的:(java,annotation,reflect)