java 对象映射_Java版的对象关系映射实现

在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个Java版的对象关系映射程序.

思路如下:

1: 对象必须是一个Java Bean.

2: 遍历对象的所有以set开头且只有一个参数的函数,为该函数提供数据值以填充该对象.

3: 如果获得的set参数值为null,则根据参数类型,以默认值对位参数调用该函数.

我的这个ORM接口名称为HiCBO,名称来自于一个C#开源项目DNN中的一个ORM转换为(CBO).

接口如下:

/**

* 根据回调填充对象

* @param obj

* @param type

* @param handler

* @return

*/

public static boolean FillObject(T obj, Class type, IEventRet8Param handler) ;

/**

* 根据回调填充对象

* @param obj

* @param type

* @param handler

* @return

*/

public static boolean FillObjectEx(T obj, Class type, IEventRet8Param handler)

该接口的调用如下:

@Test

public void Test_CBO() {

TestObj obj = new TestObj();

boolean ret = HiCBO.FillObject(obj, TestObj.class, new IEventRet8Param(){

@Override

public String OnEvent(String v) {

if (v.equals("X")) {

return "test";

}

if (v.equals("Y")) {

return "3";

}

if (v.equals("Z")) {

return "2.7";

}

if (v.equals("Date")) {

return "2016-05-19";

}

if (v.equals("Date2")) {

return "2016-05-19";

}

if (v.equals("Date3")) {

return "2016-05-19 14:03:14";

}

if (v.equals("Date4")) {

return "2016-05-19 02:03:14";

}

return null;

}

});

Assert.assertTrue(ret);

Assert.assertEquals(obj.getX(), "test");

Assert.assertEquals(obj.getY(), 3);

Assert.assertEquals(obj.getY2(), -1);

Assert.assertTrue(obj.getZ() == 2.7f);

Assert.assertEquals(obj.getDate(), HiTypeHelper.Convert2Date("2016-05-19"));

Assert.assertEquals(obj.getDate2(), HiTypeHelper.Convert2SqlDate("2016-05-19"));

Assert.assertEquals(obj.getDate3(), HiTypeHelper.Convert2Date("2016-05-19 14:03:14"));

Assert.assertEquals(obj.getDate4(), HiTypeHelper.Convert2SqlDate("2016-05-19 02:03:14"));

Assert.assertEquals(obj.getDate5(), null);

}

@Test

public void Test_CBOEx() {

TestObj obj = new TestObj();

boolean ret = HiCBO.FillObjectEx(obj, TestObj.class, new IEventRet8Param(){

@Override

public Object OnEvent(String v) {

if (v.equals("X")) {

return "test";

}

if (v.equals("Y")) {

return 3;

}

if (v.equals("Z")) {

return 2.7;

}

if (v.equals("Date")) {

return "2016-05-19";

}

if (v.equals("Date2")) {

return "2016-05-19";

}

if (v.equals("Date3")) {

return "2016-05-19 14:03:14";

}

if (v.equals("Date4")) {

return "2016-05-19 02:03:14";

}

return null;

}

});

Assert.assertTrue(ret);

Assert.assertEquals(obj.getX(), "test");

Assert.assertEquals(obj.getY(), 3);

Assert.assertEquals(obj.getY2(), -1);

Assert.assertTrue(obj.getZ() == 2.7f);

Assert.assertEquals(obj.getDate(), HiTypeHelper.Convert2Date("2016-05-19"));

Assert.assertEquals(obj.getDate2(), HiTypeHelper.Convert2SqlDate("2016-05-19"));

Assert.assertEquals(obj.getDate3(), HiTypeHelper.Convert2Date("2016-05-19 14:03:14"));

Assert.assertEquals(obj.getDate4(), HiTypeHelper.Convert2SqlDate("2016-05-19 02:03:14"));

Assert.assertEquals(obj.getDate5(), null);

}

package HiJUtil.Test;

public class TestObj {

public String x;

public String getX() {

return x;

}

public void setX(String x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public float getZ() {

return z;

}

public void setZ(float z) {

this.z = z;

}

public int y;

public float z;

private java.util.Date date;

public java.util.Date getDate() {

return date;

}

public void setDate(java.util.Date date) {

this.date = date;

}

private java.sql.Date date2;

public java.sql.Date getDate2() {

return date2;

}

public void setDate2(java.sql.Date date2) {

this.date2 = date2;

}

private java.util.Date date3;

public java.util.Date getDate3() {

return date3;

}

public void setDate3(java.util.Date date3) {

this.date3 = date3;

}

private java.sql.Date date4;

public java.sql.Date getDate4() {

return date4;

}

public void setDate4(java.sql.Date date4) {

this.date4 = date4;

}

public int y2;

public int getY2() {

return y2;

}

public void setY2(int y2) {

this.y2 = y2;

}

private java.util.Date date5;

public java.util.Date getDate5() {

return date5;

}

public void setDate5(java.util.Date date5) {

this.date5 = date5;

}

}

该接口实现代码如下:

/**

* 根据提供数据装载对象

* @param obj

* @param type

* @param handler

* @return

*/

private static boolean FillObject(T obj, Class type, IEventRet8Param2, String> handler) {

if (obj == null || handler == null) {

return false;

}

Method[] methods = type.getMethods();

for (int i = 0; i < methods.length; i++) {

Method method = methods[i];

String name = method.getName();

if (!name.startsWith("set")) {

continue;

}

if (method.getParameters().length != 1) {

continue;

}

Class> cls = method.getParameterTypes()[0];

if (cls == null) {

continue;

}

String property = name.substring(3, name.length());

try {

Object value = handler.OnEvent(cls, property);

Object ret = HiTypeHelper.Cast(cls, value);

method.invoke(obj, ret);

} catch(Exception ex) {

ex.printStackTrace();

}

}

return true;

}

/**

* 根据回调填充对象

* @param obj

* @param type

* @param handler

* @return

*/

public static boolean FillObject(T obj, Class type, IEventRet8Param handler) {

return FillObject(obj, type, new IEventRet8Param2, String>(){

public Object OnEvent(Class> cls, String property) {

return handler.OnEvent(property);

}

});

}

/**

* 根据回调填充对象

* @param obj

* @param type

* @param handler

* @return

*/

public static boolean FillObjectEx(T obj, Class type, IEventRet8Param handler) {

return FillObject(obj, type, new IEventRet8Param2, String>(){

public Object OnEvent(Class> cls, String property) {

return handler.OnEvent(property);

}

});

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源包含源代码 易看易懂 其实就是一发射机制 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。可以看出,同一般的反射概念相比,计算机科学领域的反射不单单指反射本身,还包括对反射结果所采取的措施。所有采用反射机制的系统(即反射系统)都希望使系统的实现更开放。可以说,实现了反射机制的系统都具有开放性,但具有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件。一般来说,反射系统除了满足开放性条件外还必须满足原因连接(Causally-connected)。所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。开放性和原因连接是反射系统的两大基本要素。13700863760 Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值