标签:
反射是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
一直以来对注解和反射的原理充满好奇却不胜了解。通过看书和实际编码,似乎掌握了一些东西,但离实际应用这些技术还远远不够。只有通过不停的学习,才能进步。与君共勉!
标签:
原文地址:http://blog.csdn.net/u012168222/article/details/51350314