`
tianxiaozz
  • 浏览: 25089 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

利用反射和工厂模式来模拟Hibernate生成对象

    博客分类:
  • java
阅读更多
User类 Admin类 Member类
package com.tianxiao.whut.domain;
import java.sql.Date;
import java.util.*;

import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

 
@XmlType(name = "User")  
public abstract class User {
	private String userName;
	private String userPassword;
	private String mobile;
	private String email;
	private String nickname;
	private String region;
	private java.util.Date birthday ;
	private String telephone;
	private String address;
	private String postcode;
	private String signature;
	private String imageUrl;
	private int userID;
	

}



package com.tianxiao.whut.domain;

public class Admin extends User {

	@Override
	public boolean getIsAdmin() {
		// TODO Auto-generated method stub
		return true;
	}
}



package com.tianxiao.whut.domain;

public class Member extends User {

	@Override
	public boolean getIsAdmin() {
		// TODO Auto-generated method stub
		return false;
	}
}


WebContent/WEB-INF/reflection.xml 如下

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

<bean id="admin" class="com.tianxiao.whut.domain.Admin">
</bean>

<bean id="member" class="com.tianxiao.whut.domain.Member">
</bean>

</beans>


实例创建类如下

package com.tianxiao.whut.factory;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.tianxiao.whut.domain.User;

public class InstanceFactory {
	private Map<String,String> map;
	
	
	public InstanceFactory(String fileName) {
		String dirPath = System.getProperty("user.dir");;
		
		map= readXml(dirPath+fileName);
		
	}
	
	public Object getBean(String className) {
		if(!map.containsKey(className)) 
			return null;
		Class c = null;
		Object o = null;
		try {
			c = Class.forName(map.get(className));
			o = c.newInstance();
		} catch(Exception e) {
			e.printStackTrace();
		}
		return o;
			
		
	}
	
	public Map<String,String> readXml(String fileName) {
			Map map= new HashMap<String,String>();
			DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
			try {
				   DocumentBuilder dombuilder=domfac.newDocumentBuilder();
				   InputStream is=new FileInputStream(fileName);
				   Document doc=dombuilder.parse(is);
				   Element root=doc.getDocumentElement();
				   NodeList dbinfo=root.getElementsByTagName("bean");
				   if(dbinfo!=null) {
					   for(int i=0;i<dbinfo.getLength();i++){
						  Node db=dbinfo.item(i);
						  NamedNodeMap attr = db.getAttributes();
						  Node id = attr.getNamedItem("id");
						  Node classname = attr.getNamedItem("class");
						  map.put(id.getNodeValue(), classname.getNodeValue());
				       }        
				     }
				  } catch (ParserConfigurationException e) {
				   // TODO Auto-generated catch block
				   e.printStackTrace();
				  } catch (FileNotFoundException e) {
				   // TODO Auto-generated catch block
				   e.printStackTrace();
				  } catch (SAXException e) {
				   // TODO Auto-generated catch block
				   e.printStackTrace();
				  } catch (IOException e) {
				   // TODO Auto-generated catch block
				   e.printStackTrace();
				  }
			return map;
			
		  }
}


Junit测试类如下:

import org.junit.Test;

import com.tianxiao.whut.domain.User;

public class InstanceFactoryTest {

	@Test
	public void testGetBean() {
		//fail("Not yet implemented");
		InstanceFactory instanceFactory = new InstanceFactory("/WebContent/WEB-INF/reflection.xml");
		User user = (User)instanceFactory.getBean("admin");
		System.out.println(user.getIsAdmin());
		user = (User)instanceFactory.getBean("member");
		System.out.println(user.getIsAdmin());
		
		
		
	}

}


这样就可以通过对象名来生成对象了

分享到:
评论

相关推荐

    控制反转应用,模拟Hibernate

    5. **模拟Hibernate**:在模拟Hibernate的场景下,可能需要创建一个简单的持久化框架,该框架利用IoC来管理数据库连接和对象的持久化。这可能涉及到创建一个类似于SessionFactory的类,以及一个用于执行SQL操作的DAO...

    java模拟hibernate实现

    在模拟Hibernate时,反射用于在运行时动态地创建对象、调用方法和访问属性,尤其是在处理实体类与数据库表之间的映射时。 2. **Java注解**: 注解是一种元数据,可以为编译器或运行时环境提供有关代码的附加信息。在...

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    模拟hibernate注解功能

    在这个名为“模拟hibernate注解功能”的项目中,我们将探讨如何利用自定义注解和反射技术来模仿Hibernate的注解功能。 首先,让我们理解一下Hibernate的注解。Hibernate支持JPA(Java Persistence API)标准,其中...

    hibernate注解功能模拟

    【hibernate注解功能模拟】这一主题主要涵盖了三个核心概念:Hibernate、Annotation(注解)和Reflection(反射)。在Java编程中,这三个概念对于理解对象关系映射(ORM)框架,尤其是Hibernate的工作机制至关重要。...

    使用java的反射机制来模拟hibernater的jdbc操作

    要使用反射模拟Hibernate的JDBC操作,我们需要遵循以下步骤: 1. **获取Class对象**:首先,我们需要得到目标类的Class对象,这可以通过`Class.forName()`方法实现,传入类的全名(包括包名)。 2. **创建对象**:...

    反射+注解自定义ORM

    利用反射和注解,可以方便地获取到类和字段的元信息,从而动态生成对应CRUD(Create、Read、Update、Delete)操作的SQL语句。例如,通过注解`@Table`和`@Column`,可以生成`CREATE TABLE`语句;通过类实例的字段,...

    Hibernate5教程文档大纲

    本教程详尽地涵盖了Hibernate5框架的各个方面,旨在帮助开发者深入理解和熟练使用这一强大的ORM(对象关系映射)工具。ORM技术的核心思想是将Java对象模型与关系数据库模型进行映射,使得在Java代码中可以直接操作...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK 1.6, Eclipse 3.3 Europa, SQL Server 2000 使用步骤: 1. 下载解压之后,使用Eclipse导入...

    dom4j+xml仿hibernate

    4. **事务管理**:模拟Hibernate的事务处理,确保数据操作的原子性和一致性。 5. **缓存机制**:为了提高性能,可能会实现一个简单的缓存层,存放最近访问过的对象或查询结果。 通过这样的实践,学习者可以深入理解...

    hibernate基本知识点

    通过提供一种面向对象的方法来与关系型数据库进行交互,Hibernate允许开发人员使用Java对象来表示数据库记录,并且能够通过简单的API来执行CRUD操作和其他更复杂的数据库任务。 #### Hibernate的HelloWorld示例 ...

    Java反射机制.工作原理

    总结,Java反射机制提供了强大的元编程能力,允许程序在运行时动态地操作类和对象,但同时也需要开发者关注其潜在的安全性和性能问题。理解和合理运用反射,能够极大地增强代码的灵活性和扩展性。

    cglib动态生成java类

    2. **测试**:在单元测试中,可以通过CGLib生成类的模拟对象(mock object),方便对类的方法进行模拟和测试。 3. **动态数据访问**:例如ORM框架如Hibernate,使用CGLib动态创建数据访问对象(DAO)。 总的来说,...

    2020版Java反射 4 道.pdf

    3. **测试框架**:Mockito 等测试框架利用动态代理模拟真实对象的行为,方便测试。 4. **RPC框架**:如 Dubbo 或 Hessian 在远程服务调用时,可能会使用动态代理来封装网络通信过程。 实现动态代理的方式主要有两种...

    Java Reflection in Action

    4. **代码生成**:利用反射技术可以在运行时动态生成代码,比如在Hibernate框架中用于动态创建SQL语句。 5. **性能监控和分析工具**:通过对运行时的类和方法进行分析,可以监控程序的性能,并对其进行优化。 #### ...

    reflection模拟JavaBean.rar

    这个“reflection模拟JavaBean.rar”压缩包可能包含了一个示例项目,展示了如何使用反射机制来操作JavaBean对象。JavaBean是Java中的一种特殊类,通常遵循一定的规范,用于封装数据和提供getter与setter方法,以便于...

    Java中的类反射机制

    - 数据库ORM框架:如Hibernate,根据数据库表结构动态生成Java对象。 - 测试工具:JUnit等测试框架使用反射来模拟方法调用或注入依赖。 - 日志和监控:获取类信息,分析运行时行为。 ### 7. 性能与安全性 虽然反射...

    cglib jar包

    2. **ORM(对象关系映射)**: Hibernate框架在某些情况下,如实体类没有实现接口时,也会使用CGLIB来生成代理对象,实现懒加载等特性。 3. **性能优化**: 对于性能敏感的应用,CGLIB可以比Java反射机制提供更快的...

    cglib.jar免费下载

    - **高性能的工厂模式实现**:CGLIB可以用于创建高效的单例或者多例工厂,避免了反射带来的性能损失。 了解CGLIB的工作原理和使用方式对于Java开发者来说至关重要,因为它可以帮助优化代码结构,提升程序性能,并...

    cglib的一系列jar包

    CGLib在实际开发中有多种应用场景,如AOP(面向切面编程)框架Spring中的动态代理,ORM(对象关系映射)框架Hibernate的懒加载机制,以及测试框架Mockito的模拟对象等。通过使用CGLib,开发者可以更加灵活地处理复杂...

Global site tag (gtag.js) - Google Analytics