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;
@Description
public 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等框架的实现原理的更多相关文章

  1. spring+springMVC+mybatis的框架项目基础环境搭建

    上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这 ...

  2. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...

  3. spring结合Mybatis的框架搭建(一)

    一:前沿 2015年新年上班的第二天,第一天就打了一天的酱油哦,只是下午开始搭建自己毕业设计的框架,搭建的是spring+spring mvc+MyBatis的框架.今天遇到了一个问题,结果弄了我一天 ...

  4. SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程【附源代码Demo】

    [前言] 应某网络友人邀约,需要一个SSM框架的Demo作为基础学习资料,于是乎,就有了本文.一个从零开始的SSM框架Demo对一个新手来说,是非常重要的,可大大减少在学习过程中遇到的各种各样的坑,说 ...

  5. IntelliJ IDEA 14.0.3 实战搭建Spring+SpringMVC+MyBatis组合框架

    简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发的框架,对于新手来说也是比较容易学习入门的.虽说容易,但在框架搭建过程中仍然遇到了许多问题,因此用实 ...

  6. Spring+SpringMVC+MyBatis+Redis框架学习笔记

    在Java互联网中,以Spring+Spring MVC+MyBatis (SSM) 作为主流框架. SSM+Redis的结构图 在这种框架系统中: Spring IoC 承担了一个资源管理.整合.即 ...

  7. SSM(spring,springMVC,Mybatis)框架的整合

    这几天想做一个小项目,所以搭建了一个SSM框架. 1.基本概念 1.1.Spring   Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Joh ...

  8. [转]SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程【附源代码Demo】

    一.新建项目 运行IDEA,进入初始化界面,然后我们选择新建项目(进入主界面新建项目也是一样的) 在Maven选项卡里面找到对应的java web选项,然后我们点下一步 这一步填入组织等信息,这里比较 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSM(Spring+Spring MVC+MyBatis)框架整合搭建详细步骤

    因为 Spring MVC 是 Spring 框架中的一个子模块,所以 Spring 与 SpringMVC 之间不存在整合的问题.实际上,SSM 框架的整合只涉及 Spring 与 MyBatis ...

随机推荐

  1. [js开源组件开发]js手机端浮层控件,并有多种弹出小提示,兼容pc端浏览器

    js dialog组件,包含alert和confirm的实现 本组件所有的资源均在github上可以查看源代码 GitHub 本dialog的组件的例子请在这里查看 demo dialog js di ...

  2. sublimetext Emmet插件(Zen coding)

    1.省略div,插件会默认元素为div .container <div class="container"></div> 含糊标签名称,比如不需要指定li, ...

  3. 在SharePoint中无代码开发InfoPath应用: 获取当前用户信息

    很多种不同的场景下,会需要得到当前的用户信息,例如需要根据当前用户判断组,进而控制权限. 首先InfoPath提供了一个userName方法,来实现这个目的,不过这个方法的问题是只能获得不包含域名的用 ...

  4. 数组拷贝 copyOf()

    Arrarys类的copyof方法与copyOfRange方法可以实现对数组的复制,前者是复制数组到指定的长度,后者将指定的长度复制到一个新数组中. 1.copyOf()方法 该方法提供了很多种重载形 ...

  5. [leetcode] Count Primes

    Count Primes Description: Count the number of prime numbers less than a non-negative number, n click ...

  6. java多线程系列1--线程实现与调度

    java的重要功能之一就是内部支持多线程,这一系列文章将详细剖析java多线程的基础知识 多线程概述 多线程引入 程序只有一个执行流程,所以这样的程序就是单线程程序. 假如一个程序有多条执行流程,那么 ...

  7. 弃用的同步get和post请求

    #import "ViewController.h" #import "Header.h" @interface ViewController () <N ...

  8. IOS MenuController初步了解

    IOS MenuController初步了解 默认情况下有以下控件已经支持MenuController. UITextField UITextView UIWebView 让其他控件也支持MenuCo ...

  9. Xcode 插件失效的临时解决方案

    每当Xcode升级之后,都会导致原有的Xcode插件不能使用,这是因为每个插件的Info.plist中记录了该插件兼容的Xcode版本的DVTPlugInCompatibilityUUID,而每个版本 ...

  10. Hive安装与配置(靠谱亲测)

     Hive是hadoop生态环境的组成之一.通过Hive,可以使得直接用SQL操作HDFS.最大的好处就是让熟悉SQL,但是不了解JAVA的数据分析师使用.其机制就是一个将SQL语言转化为MapRed ...