这个简单的案例是实行了登录和注册的功能,没有链接数据库。
 在bean中id 是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\....
 package com.obtk.reflect;

 public class Logon {
/**
* 帐号密码长度大于六位字符就成功,否则失败!
* */
public String select(String name, String pass) {
if (name.length() > 6 && pass.length() > 6) {
return name + "用户,恭喜你注册成功";
}
return name + "用户,注册失败,密码长度或者帐号长度不对!";
} /**
* 帐号密码长度大于六位字符就成功,否则失败!
* */
public String get(String name, String pass) {
if (name.length() > 6 && pass.length() > 6) {
return name + "用户,恭喜你登录成功";
}
return name + "用户,登录失败,密码和帐号不匹配!";
}
}

Logon.java 实体类代码

 package com.obtk.reflect;

 import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class LogonReflect { private Map<String, Object> beans = new HashMap<String, Object>(); /**
* 解析xml文档
* */
public LogonReflect(String xmlFile) {
try {
// 获取xm文档解析
SAXReader reader = new SAXReader();
// 获取加载器
ClassLoader loader = Thread.currentThread().getContextClassLoader();
// classes文件夹读取配置文件
InputStream is = loader.getResourceAsStream(xmlFile);
// 从文件流读取数据构建xml文档对象
Document doc = reader.read(is);
// 获取xml的根节点(beans)
Element root = doc.getRootElement();
// 获取根节点所有的子节点(bean)
Iterator<Element> beanEI = root.elementIterator("bean");
// 循环所有的子节点
while (beanEI.hasNext()) {
// 获取本次循环的子节点
Element eBean = beanEI.next();
// 获取bean节点的id的文本内容
String id = eBean.attribute("id").getText();
// 获取bean节点的class的文本内容
String className = eBean.attribute("class").getText();
// 第一个个 参数座位id,第二个参数做为一个类的实例化对象
beans.put(id, Class.forName(className).newInstance());
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 根据id获取所对的对象
* */
public Object getBean(String beanName) {
return beans.get(beanName);
}
}

LogonReflect.java 实体类代码

 package com.obtk.reflect;

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

测试类的代码

 <beans>
<bean id="logon" class="com.obtk.reflect.Logon" />
</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的内部工作原理的更多相关文章

  1. 自定义模拟一个Spring IOC容器

    一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...

  2. 阿里P7工作总结:Spring MVC的工作原理,看完受益匪浅

    这篇文章将深入探讨Spring框架的一部分——Spring Web MVC的强大功能及其内部工作原理. 项目安装 在本文中,我们将使用最新.最好的Spring Framework 5.我们将重点介绍S ...

  3. Hibernate、Spring和Struts2工作原理

    Hibernate.Spring和Struts2工作原理 博客分类: Java 基础 工作HibernateSpringMVCStruts  Hibernate.Spring和Struts2工作原理  ...

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

    前言 开心一刻 晚上陪老丈人吃饭,突然手机响了,我手贱按了免提……哥们:快出来喝酒!哥几个都在呢!我:今天不行,我现在陪老丈人吃饭呢.哥们:那你抓紧喝,我三杯白酒,把我岳父放倒了才出来的,你也快点.看 ...

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

    到目前为止,我们已经讨论了ZooKeeper服务的基础知识,并详细了解了数据模型及其属性. 我们也熟悉了ZooKeeper 监视(watch)的概念,监视就是在ZooKeeper命名空间中的znode ...

  6. Spring MVC的工作原理和机制

    Spring  MVC的工作原理和机制 参考: springMVC 的工作原理和机制 - 孤鸿子 - 博客园https://www.cnblogs.com/zbf1214/p/5265117.html ...

  7. 4000余字为你讲透Codis内部工作原理

    一.引言 Codis是一个分布式 Redis 解决方案,可以管理数量巨大的Redis节点.个推作为专业的第三方推送服务商,多年来专注于为开发者提供高效稳定的消息推送服务.每天通过个推平台下发的消息数量 ...

  8. Apache Lucene评分机制的内部工作原理

    Apache Lucene评分机制的内部工作原理' 第5章

  9. 利用反射--调用一个按钮的Click事件

    最基本的调用方法 (1)button1.PerformClick();(2)button1_Click(null,null);(3)button_Click(null,new EventArgs()) ...

随机推荐

  1. JS事件模型小结

    三种事件模型:原始事件模型(DOM0),DOM2事件模型,IE事件模型: 不同点: 事件程序的注册(给HTML元素所对应的JS对象绑定事件) 事件传播的过程 事件模型的注册: 一.原始事件模型(没有兼 ...

  2. validate插件深入学习-02 常用方法和validate对象的方法

    ①检查表单元素是否有效 valid() 在表单内添加<button id="check">检查</button> $('#check').click(fun ...

  3. html5 formData上传 针对app端

    function uploadFile() { if ((document.getElementById("file").files[0].size / 1024).toFixed ...

  4. Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)

    一.目前只有一个Live节点存在 单节点获取方式如下: public function getStreamByIp($outerIP, $streamName) { //查询录像模块的IP地址外网,根 ...

  5. ThinkPHP3.2中if判断条件是两个变量

    <select name="typeId"> <foreach name="typeInfo" item="v"> ...

  6. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  7. 参考__JS

    教程 jQuery选择器总结 日期和时间 Bootstrap日期和时间表单组件 图表 morrisHighcharts 垂直滚动 fsvs 水平滚动 swiper 倒计时 countdownjs 全屏 ...

  8. mysql字符串函数(转载)

    对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的 最左面字符的ASCII代码值.如果str是空字符串, 返回0.如果str是NULL,返回NULL. mysq ...

  9. Java开发基础

    天数 课程 01 Java基础回顾 集合 泛型 IO流 多线程 Junit Properties   HTML   JavaScript   JavaScript   BOM编程   XML基础   ...

  10. react 学习笔记

    1.Router 1.1 Histories React Router 是建立在 history 之上的.一个 history 知道如何去监听浏览器地址栏的变化, 并解析这个 URL 转化为 loca ...