通过反射创建类

原创 2013年12月04日 23:44:37

这里使用到的反射是模拟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);
	}
}

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Spring中BeanFactory和FactoryBean的区别

org.springframework.beans及org.springframework.context包是Spring IoC容器的基础。BeanFactory提供的高级配置机制,使得管理任何性质...

反射创建泛型类

  • 2015年11月15日 13:28
  • 797KB
  • 下载

C#反射创建类的实例

  • 2011年09月26日 20:26
  • 53KB
  • 下载

Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用

java 动态编译代码(在运行阶段动态注入代码)

C++实现 反射 机制( 即根据 类名 创建 类实例)Create C++ Object Dynamically

Create C++ Object Dynamically Introduction C++不像C#和Java那样具有反射的能力,通常不能根据任意一个class name来创建该class的ins...
  • klarclm
  • klarclm
  • 2012年03月14日 11:02
  • 4481

java学习---使用反射创建类的实例

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 大家都知道:当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的。...

设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类!这个例子也可以用简单工厂模式+反射+读取配置文件来完成,这样更加简洁!!!普通的抽象工厂模式下面通过一个模拟访问数据库...

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法?
  • phker
  • phker
  • 2016年06月21日 08:37
  • 725

通过反射,创建类的实例三

这次我们通过构造函数的方式处理 using System; using System.Reflection; namespace App { public class TypeHelper...
  • Joyhen
  • Joyhen
  • 2017年10月24日 19:03
  • 57

typeof(C# 参考)C# 反射 通过类名创建类实例

C# 反射 通过类名创建类实例2011-12-24 上午 12:34“反射”其实就是利用程序集的元数据信息。   反射可以有很多方法,编写程序时请先导入 System.Reflection...
  • wlanye
  • wlanye
  • 2012年02月07日 16:55
  • 4287
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过反射创建类
举报原因:
原因补充:

(最多只允许输入30个字)