这个简单的案例是实行了登录和注册的功能,没有链接数据库。
 在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. TFS二次开发系列:六、TFS的版本控制

    在TFS中对于版本控制是在WorkSpace工作区来控制的. 首先我们先整理WorkSpace的一些基本使用方法. CheckIn:迁入挂起的操作 CreateMapping:创建一个本地映射地址 D ...

  2. Jenkins + maven + Git+selenium

    1.在Jenkins中配置Maven与Git 1)在系统管理>管理插件>可选插件 页面分别下载Git plugin 与 Maven Integration plugin插件,安装完成后再已 ...

  3. DOM对象与jquery对象有什么不同

    jQuery对象和DOM对象使用说明,需要的朋友可以参考下.1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象,哪些是 DOM对象,因此需要重点了解jQuery ...

  4. VR外包 虚拟现实外包 北京软件公司

    我们制作各类型VR全景虚拟现实,增强现实视频制作.录制等项目.品质保证,售后完备,可签合同.contectus: 13911652504(技术经理tommy) 承揽VR外包 虚拟现实外包 U3D外包( ...

  5. ajax提交表单+前端验证小示例

    <script src="http://css.jj.cn/js/jquery.js" type="text/javascript"></sc ...

  6. git pull 然后 ahead of origin/master * commit 消失

    本来显示 your branch is ahead origin/master * commit后来也许在master merge 这个分支后, 然后git pull, 就显示Your branch ...

  7. openssl pem 生成公钥和私钥及文件

    openssl pem.h 中提供了关于pem格式密钥对的操作接口 通常使用.pem的格式文件来保存openssl 生成的密钥对: 在终端下 cat xxx.pem 可以看到 p.p1 { margi ...

  8. pc端页面在移动端显示问题

    1.pc端页面在移动端显示,默认视口宽度是980px(也就是body宽度是980px),可通过meta标签设置为需要的尺寸,比如页面中元素最大宽度是1220px,则如下所示 <meta name ...

  9. visual studio 工具的使用

    1,快捷键 a, ctrl+e ,ctrl+c 快速注释  ctrl+e ,ctrl+u 取消注释 b,ctrl+k,ctrl+d 快速格式化. 2,开发相关 a,在Microsoft Visual ...

  10. Discuz! X3.1直接进入云平台列表的方法

    Discuz! X3.1已经改版,后台不能直接进云平台列表,不方便操作,操作云平台服务时,大家可以这样操作: 1.登录后台:2.访问域名进入云平台列表http://你域名/admin.php?fram ...