工厂模式 ioc dom4j 反射之我的一点理解

工厂模式

//工厂模式我的理解
//第一次调用没有实例化的对象时 会去内存中查找(栈)
//如果没有找到,就去xml配置中查找className和他相同的类名
//找到的话就让工厂进行实例化,初始化对象
//没找到的话就空指针异常

 

公产模式就是ioc(inversion of control) 和hibernate的控制反转有点像  就是把自身不维护关系,交给别人来维护关系

dao层,service层在编码时只声明对象,而把实例化对象的权利交给工厂,工厂通过配置文件来配置类(对象)的信息,

然后由框架(虚拟机)来自动实例化对象,当然工厂采用的是单例模式,当该对象被实例化一次后,下次调用就直接获取(内存中反射?静态成员变量?)

 

通过dom4j和xpath以及反射技术来模拟beanfactory的getBean("stu1")方法

<?xml version="1.0" encoding="UTF-8"?>

<beans>
	<bean id="stu1" className="cn.itcast.domain.Student">
		<property name="number" value="ITCAST_1001"/>
		<property name="name" value="zhangSan"/>
		<property name="age" value="29"/>
		<property name="sex" value="male"/>
<!-- 		<property name="teacher" ref="t1"/>ref的值必须是另一个been的id -->
	</bean>
	
	<bean id="stu2" className="cn.itcast.domain.Student">
		<property name="number" value="ITCAST_1002"/>
		<property name="name" value="wangWu"/>
		<property name="age" value="94"/>
		<property name="sex" value="female"/>
		<property name="teacher" ref="t1"/><!-- ref的值必须是另一个been的id -->
	</bean>
	
	<bean id="t1" className="cn.itcast.domain.Teacher">
		<property name="tid" value="TEACHER_2001" />
		<property name="name" value="liSi" />
		<property name="salary" value="123.456" />
	</bean>
	
	<bean id="stuDao" className="cn.itcast.dao.impl.StudentImpl2">
	</bean>
	
	<bean id="stuService" className="cn.itcast.service.impl.StudentServiceImpl">
		<property name="studentDao" ref="stuDao"/>
	</bean>
</beans>

  给定字符串"stu1" 

1.Document document = reader.read(this.getClass().getResourceAsStream("/beans.xml"));
//获取类路径下的文件 是相对于class文件夹下的 加"/"是从bin javaweb是从class文件夹下
//classPath 存放class(字节码)的总文件夹

2.dom4j的一些方法

Element root = document.getRootElement(); 

Node是父类 Attribute,Element是子类 可以相互转换

Element.elements() 获取子节点 

Attribute.attributes()获取所有属性

Attribute.getName()获取属性name

Attribute.getValue()获取属性value

Attribute.attributeValue("xx")获取属性xx的value

document.selectNodes(xpath)查找满足xpath表达式的所有节点集合

document.selectSingleNode(xpath)获取满足xpath的单个节点

 

反射的一些知识

getField(xx):获取public成员

getDecalreField(xx)获取所有成员

classForName只能加载类(引用)类型的 ,不能加载基本数据类型的

 

 

获取成员变量的数据类型

Field f=clazz.getDeclaredField(e.attributeValue("name"));

// System.out.println(f.getName()+f.getType().getName());

 

获取方法的参数类型

	public static Class[]  getMethodParamTypes(Object classInstance, 
			String methodName) throws ClassNotFoundException{
		Class[] paramTypes = null;
		Method[]  methods = classInstance.getClass().getMethods();//全部方法
		for (int  i = 0;  i< methods.length; i++) {
			if(methodName.equals(methods[i].getName())){//和传入方法名匹配 
				Class[] params = methods[i].getParameterTypes();
				paramTypes = new Class[ params.length] ;
				for (int j = 0; j < params.length; j++) {
					paramTypes[j] = Class.forName(params[j].getName());
				}
				break; 
			}
		}
		return paramTypes;
	}

  

字符串首字母大写

	public static String captureName(String name) {
		//  name = name.substring(0, 1).toUpperCase() + name.substring(1);
		// return  name;
		char[] cs=name.toCharArray();
		cs[0]-=32;
		return String.valueOf(cs);

	}

  

转载于:https://www.cnblogs.com/lt123/p/7273597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值