关闭

通过反射创建类

标签: 反射
745人阅读 评论(0) 收藏 举报

这里使用到的反射是模拟Spring框架的自动装配这一个功能,在我们没有学习Spring框架的时候,或没学反射机制的时候,通常我们创建一个类的实例都是通过new关键字来实例化一个类的,后来我们则陆续的学了java的反射机制,通过反射机制也可以实例化一个类,但是每次都要写一堆的代码,相对与来说是痛苦的,而后来我们有学习了Spring框架,它里面的依赖注入,则使用了Java的反射机制,通过配置文件,就可以实现类的实例化。

下面我们就自己模拟Spring的依赖注入这一个功能来实现,真正的Spring框架的依赖注入当然没我这个简单,这个我只是把反射机制巩固一下,方便以后使用

当然这些说的都是我自己瞎掰的,说错了的地方或写错了的地方,还请多多指教。


这个例子的步骤

1、创建一个Java项目

2、创建所需要的类

3、创建一个xml文件


第一步就免了

2、这里我创建的类有Users.java、UsersDao.java、UsersDaoImpl.java、UsersService.java、UsersServiceImpl.java、BeanFactory.java、ClassPathXmlApplicationContext.java

代码加上:

Users.java

package com.tenghu.spring.model;

public class Users {
	//编号
	private int id;
	//姓名
	private String name;
	//年龄
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

UsersDao.java---接口

package com.tenghu.spring.dao;

import com.tenghu.spring.model.Users;

public interface UsersDao {
	public void addUsers(Users user);
}

UsersDaoImpl.java

package com.tenghu.spring.dao.impl;

import com.tenghu.spring.dao.UsersDao;
import com.tenghu.spring.model.Users;

public class UsersDaoImpl implements UsersDao{

	@Override
	public void addUsers(Users user) {
		System.out.println("添加成功");
	}

}

UsersService.java

package com.tenghu.spring.service;

import com.tenghu.spring.model.Users;

public interface UsersService {
	public void addUsers(Users user);
}

UsersServiceImpl.java

package com.tenghu.spring.service.impl;

import com.tenghu.spring.dao.UsersDao;
import com.tenghu.spring.model.Users;
import com.tenghu.spring.service.UsersService;

public class UsersServiceImpl implements UsersService{
	private UsersDao userDao;

	public UsersDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UsersDao userDao) {
		this.userDao = userDao;
	}

	@Override
	public void addUsers(Users user) {
		userDao.addUsers(user);
	}
	
	
}

BeanFactory.java

package com.tenghu.spring.spring;

public interface BeanFactory {
	//根据名称获取对象
	public Object getBean(String name);
}

ClassPathXmlApplicationContext.java

package com.tenghu.spring.spring;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import com.tenghu.spring.test.Test;

public class ClassPathXmlApplicationContext implements BeanFactory {
	//创建Map集合
	private Map<String, Object> bean=new HashMap<String, Object>();
	public ClassPathXmlApplicationContext() {
		try {
			//创建SAXBuilde对象
			SAXBuilder builder = new SAXBuilder();
			//获取文档对象
			Document doc = builder.build(Test.class.getClassLoader()
					.getResourceAsStream("myApplicationContext.xml"));
			// 获取根节点
			Element ele = doc.getRootElement();
			// 获取子节点
			List list = ele.getChildren("bean");
			for (int i = 0; i < list.size(); i++) {
				Element child = (Element) list.get(i);
				String id = child.getAttributeValue("id");
				String clazz = child.getAttributeValue("class");
				//通过反射获取对象
				Object o=Class.forName(clazz).newInstance();
				//添加到集合中
				bean.put(id, o);
				for(Element childElement:(List<Element>)child.getChildren("property")){
					//获取参数
					String name=childElement.getAttributeValue("name");
					String ref=childElement.getAttributeValue("ref");
					//获取对象
					Object obj=bean.get(ref);
					//拼接set方法
					String methodName="set"+name.substring(0,1).toUpperCase()+name.substring(1);
					//反射获取方法
					Method m=o.getClass().getDeclaredMethod(methodName, obj.getClass().getInterfaces()[0]);
					m.invoke(o, obj);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public Object getBean(String name) {
		return bean.get(name);
	}

}

3、创建xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="ud" class="com.tenghu.spring.dao.impl.UsersDaoImpl"/>
	<bean id="userServiceImpl" class="com.tenghu.spring.service.impl.UsersServiceImpl">
		<property name="userDao" ref="ud"/>
	</bean>
</beans>

测试

package com.tenghu.spring.test;

import com.tenghu.spring.model.Users;
import com.tenghu.spring.service.UsersService;
import com.tenghu.spring.spring.BeanFactory;
import com.tenghu.spring.spring.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		//创建ClassPathXmlApplicationPath对象
		BeanFactory factory=new ClassPathXmlApplicationContext();
		Users user=new Users();
		user.setId(1);
		user.setName("李四");
		user.setAge(23);
		UsersService us=(UsersService) factory.getBean("userServiceImpl");
		us.addUsers(user);
	}
}

这样整个功能就算是实现了


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:122874次
    • 积分:1912
    • 等级:
    • 排名:千里之外
    • 原创:71篇
    • 转载:2篇
    • 译文:0篇
    • 评论:21条
    最新评论