首页 > 代码库 > 注解与反射 ---Spring与Mybatis等框架的实现原理
注解与反射 ---Spring与Mybatis等框架的实现原理
Java中各大框架,无论是AOP 还是 IoC 其基本实现思路都是源自Java 运行时支撑的反射功能,
而反射最基本的一点就是 任何一个类 其在JVM环境中,都有一个对象的Class对象,这个对象提供一些方面描述了类的 方法 构造函数 注解 等等等
下面就是一个反射跟注解的小例子,是一个比较好入门的小demo
理解之后,几乎所有的框架都是依照这个思路来实现的
package pw.jonwinters.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Documented//生成javadoc会包含注解信息@Inherited//允许子类注解继承@Target({ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.TYPE})//注解作用的位置 method为方法上的注解 constructor为构造器上的注解 TYPE则是针对类型以及接口等上的注解@Retention(RetentionPolicy.RUNTIME)//注解的生存周期,这里注明runtime运行时,也就是说这个注解在编译成class文件 运行在虚拟机的时候 这个注解信息依然存在public @interface Description { String desc() default "winter";//default 默认没有赋值的话 则为winter}
package pw.jonwinters.annotation;import java.lang.reflect.Method;import org.junit.Test;import static org.junit.Assert.assertNotNull;@Descriptionpublic class Man implements Person { @Override @Description public void run() { // TODO Auto-generated method stub System.out.println("I am run() method!"); } @Test public void testAnnotation() throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Class clazz = Class.forName("pw.jonwinters.annotation.Man");//首先通过Class.forName加载我们的Man类 assertNotNull("can‘t find class",clazz);//找不到就提示 Method[] methods = clazz.getDeclaredMethods();//获得clazz对象之后,获取Man类的所有方法 for (Method method:methods){ if(method.isAnnotationPresent(Description.class)){//针对每一个方法 判断它是否存在Description注解 System.out.println("method: "+method.getName()+"() has Description annotation!"); System.out.println(method.getAnnotation(Description.class).desc());//打印注解的desc字段 默认是winter } if(method.isAnnotationPresent(Override.class)) System.out.println("method: "+method.getName()+" has Override annotation!"); //overrider注解是 RetentionPolicy.SOURCE 只针对源码存在,在JVM运行时环境不存在 所以我们是无法找到run()方法上面的override注解的 } if ( clazz.isAnnotationPresent(Description.class)) { ((Man)clazz.newInstance()).run();//最后如果类 也存在Description注解的话 则实例化一 clazz对象 向下转型为Man方法 调用其run方法打印 I am run method } }}
注解与反射 ---Spring与Mybatis等框架的实现原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。