利用反射模拟一个spring的内部工作原理

  • 这个简单的案例是实行了登录和注册的功能,没有链接数据库。

  • 在bean中id
    是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\....


 1 package com.obtk.reflect;
2
3 public class Logon {
4 /**
5 * 帐号密码长度大于六位字符就成功,否则失败!
6 * */
7 public String select(String name, String pass) {
8 if (name.length() > 6 && pass.length() > 6) {
9 return name + "用户,恭喜你注册成功";
10 }
11 return name + "用户,注册失败,密码长度或者帐号长度不对!";
12 }
13
14 /**
15 * 帐号密码长度大于六位字符就成功,否则失败!
16 * */
17 public String get(String name, String pass) {
18 if (name.length() > 6 && pass.length() > 6) {
19 return name + "用户,恭喜你登录成功";
20 }
21 return name + "用户,登录失败,密码和帐号不匹配!";
22 }
23 }

Logon.java 实体类代码


 1 package com.obtk.reflect;
2
3 import java.io.InputStream;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.Map;
7 import org.dom4j.Document;
8 import org.dom4j.Element;
9 import org.dom4j.io.SAXReader;
10
11 public class LogonReflect {
12
13 private Map<String, Object> beans = new HashMap<String, Object>();
14
15 /**
16 * 解析xml文档
17 * */
18 public LogonReflect(String xmlFile) {
19 try {
20 // 获取xm文档解析
21 SAXReader reader = new SAXReader();
22 // 获取加载器
23 ClassLoader loader = Thread.currentThread().getContextClassLoader();
24 // classes文件夹读取配置文件
25 InputStream is = loader.getResourceAsStream(xmlFile);
26 // 从文件流读取数据构建xml文档对象
27 Document doc = reader.read(is);
28 // 获取xml的根节点(beans)
29 Element root = doc.getRootElement();
30 // 获取根节点所有的子节点(bean)
31 Iterator<Element> beanEI = root.elementIterator("bean");
32 // 循环所有的子节点
33 while (beanEI.hasNext()) {
34 // 获取本次循环的子节点
35 Element eBean = beanEI.next();
36 // 获取bean节点的id的文本内容
37 String id = eBean.attribute("id").getText();
38 // 获取bean节点的class的文本内容
39 String className = eBean.attribute("class").getText();
40 // 第一个个 参数座位id,第二个参数做为一个类的实例化对象
41 beans.put(id, Class.forName(className).newInstance());
42 }
43
44 } catch (Exception e) {
45 e.printStackTrace();
46 }
47 }
48
49 /**
50 * 根据id获取所对的对象
51 * */
52 public Object getBean(String beanName) {
53 return beans.get(beanName);
54 }
55 }

LogonReflect.java
实体类代码


 1 package com.obtk.reflect;
2
3 public class LogonTest {
4 public static void main(String[] args) {
5 //传一个xml路径,
6 LogonReflect lReflect = new LogonReflect("Logon.xml");
7 //根据id去xml中获取实体类,默认是Object类型的,所以要强制转换
8 Logon logon = (Logon) lReflect.getBean("logon");
9 //获取对象任何就直接调用方法
10 System.out.println(logon.get("123456789", "987654321"));
11 System.out.println(logon.select("qqqqqqq", "qqqqqqq"));
12 }
13 }

测试类的代码


1 <beans>
2 <bean id="logon" class="com.obtk.reflect.Logon" />
3 </beans>

beans.xml 配置xml

  1. Reflection的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起(调用)其methods。这种“看透class”的能力(the
    ability of the program to examine itself)被称为introspection


  2. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息,以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制。Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。








  • 文件名

    说 明

    getFields()
    getDeclaredFields()
    getField(String
    name)
    getMethods()
    getMethod (String name,Class []
    args)
    getConstrutors()
    getConstrutor(Class[]
    args)
    newInstance()
    getName()
    getPackage()
    getSuperclass()

    获得类的public类型的属性。
    获得类的所有属性

    获得类的指定属性
    获得类的public类型的方法
    获得类的指定方法
    获得类的public类型的构造方法
    获得类的特定构造方法
    通过类的无参构造方法创建该类的一个对象
    获得类的完整名字
    获取此类所属的包
    获得此类的父类对应的Class对象


利用反射模拟一个spring的内部工作原理,布布扣,bubuko.com

时间: 2024-10-10 16:17:02

利用反射模拟一个spring的内部工作原理的相关文章

前端必读:浏览器内部工作原理

前端必读:浏览器内部工作原理 作者: Tali Garsiel  发布时间: 2012-02-09 14:32  阅读: 56974 次  推荐: 88   原文链接   [收藏] 目录 一.介绍 二.渲染引擎 三.解析与DOM树构建 四.渲染树构建 五.布局 六.绘制 七.动态变化 八.渲染引擎的线程 九.CSS2可视模型 英文原文:How Browsers Work: Behind the Scenes of Modern Web Browsers 一.介绍 浏览器可以被认为是使用最广泛的软

Spring MVC的工作原理,我们来看看其源码实现

前言 开心一刻 晚上陪老丈人吃饭,突然手机响了,我手贱按了免提……哥们:快出来喝酒!哥几个都在呢!我:今天不行,我现在陪老丈人吃饭呢.哥们:那你抓紧喝,我三杯白酒,把我岳父放倒了才出来的,你也快点.看着我老丈人的脸,我不知道该怎么回了…… 猪一样的队友 遗留问题 在关于利用maven搭建ssm的博客,我们一起来探讨下问的最多的问题中,我遗留了一个问题:Spring mvc是何时.何地.如何将Model中的属性绑定到哪个作用域,这里的作用域指的是Servlet的四大作用域:不了解问题背景的可以回过

zookeeper 内部工作原理

zookeeper 内部工作原理1.原子广播zookeeper的核心就是消息处理原子性,能够保持所有的server同步 2.保证,属性和一些定义zookeeper 能够保证消息处理原子性的特性包括:1)可靠的消息传递如果一个消息m, 某个server接收了,那么基本上所有server肯定也都接收到了该消息2)顺序接收如果message a 先于message b 被某个server接收,那么所有server接收a 都会先于b.a 和b 同时传递消息的话,反正要么a在前,要么b在前,就是不会出现并

8. 理解ZooKeeper的内部工作原理

到目前为止,我们已经讨论了ZooKeeper服务的基础知识,并详细了解了数据模型及其属性. 我们也熟悉了ZooKeeper 监视(watch)的概念,监视就是在ZooKeeper命名空间中的znode发生任何变化时完成的事件机制. 我们通过公开一组与znodes相关联的ACL来读取身份验证和基本安全模型. 在本节中,我们将通过介绍ZooKeeper session的概念来讨论和了解客户端与ZooKeeper服务交互的生命周期. 我们还将详细阅读ZooKeeper如何在内部描述协议. 了解以及深入

利用maven构建一个spring mvc的helloworld实例

刚开始学习maven和spring mvc,学的云里雾里的 这里提供一个hello world实例,记录自己的学习之路 首先看maven官网的介绍 Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and do

Spring特点与工作原理

根据多个参考资料,总结如下: Spring的概念 Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系.它是一种容器框架,用于创建bean,维护bean之间的关系,它可以管理web层,持久层,业务层等,可以配置各个层的组件并且维护各个层的关系 Spring特点 (1)轻量级:轻量级是针对重量级容器(EJB)来说的,Spring的核心包就不到1M大小,而使用Spring的核心包所需的资源也很小,所以可以在小型设备中使用. (2)非入侵式:Spring目标

浏览器内部工作原理

转:http://kb.cnblogs.com/page/129756/#chapter9 目录 一.介绍 二.渲染引擎 三.解析与DOM树构建 四.渲染树构建 五.布局 六.绘制 七.动态变化 八.渲染引擎的线程 九.CSS2可视模型 英文原文:How Browsers Work: Behind the Scenes of Modern Web Browsers 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到g

详解HashMap的内部工作原理

本文将用一个简单的例子来解释下HashMap内部的工作原理.首先我们从一个例子开始,而不仅仅是从理论上,这样,有助于更好地理解,然后,我们来看下get和put到底是怎样工作的. 我们来看个非常简单的例子.有一个”国家”(Country)类,我们将要用Country对象作为key,它的首都的名字(String类型)作为value.下面的例子有助于我们理解key-value对在HashMap中是如何存储的. 1. Country.java 1 2 3 4 5 6 7 8 9 10 11 12 13

Worker的内部工作原理

一.Worker.Executor.Task 三者的关系 storm集群中的一台机器可能运行着一个或者多个worker进程,其从属于一个或者多个topology.一个worker进程运行着多个executor线程:每一个worker从属于一个topology:executor是单线程,每一个executor运行着相同组件(spout或者bolt)的1个或者多个task:1个task执行(spout或bolt)中的逻辑处理:用一句话来概括就是,一个worker运行着一个或者多个executor,每