反射和注解的使用

反射和注解的使用

反射是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
总结:

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值