- 浏览: 249898 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
pshaoyi:
连接创建没问题,在执行的时候就报错了。Caused by: c ...
jdbc连接池简单封装 -
imbangbang:
中文乱码,没有解决掉
Java实现Zip压缩与解压(解决中文乱码问题) -
chjy1983:
麻烦也发份给我,chl_82@126.com,谢谢!
Java实现Zip压缩与解压(解决中文乱码问题) -
jidacwj:
楼主写的这个有问题呀首先,多线程分割文件第45行,我尝试打印每 ...
Java 大文件读取排序 -
www6wzk:
非常好的学习例子,十分感谢!
Jbpm工作流实例—报销申请
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
利用java的反射机制可以进行简单的ORM即对象关系映射
如下面代码:
在这个简单的ORM中,利用Java的反射机制动态创建实例,不需要事先知道要生成什么对象或对象集合,只需要在调用的时候转型(当然也可以使用jdk1.5的泛型技术),使用m.invoke(object, rs.getObject(colName))方法动态设置实例的属性,注意,在这个例子中,user类必须是一个标准的Javabean,具有各个属性的setter/getter方法以及一个没有参数的构造函数,上面例子中使用sql的别名来实现动态调用对象的方法,(Hibernate使用配置文件.hbm.xml文件完成数据库字段到javabean的映射),只需要在写查询sql的时候指定好别名就可以完成javabean属性的设置。
假如有另外一个类 Product
这样我们在查询的时候只需要执行下面语句就可以获得封装好的Product对象/集合
这样的代码更具有动态性,不用每个查询写一个查询方法
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
package com.royzhou.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTest { private String id; private String name; public String property; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public ReflectTest() { System.out.println("this is a constructor with no params!!!"); } public ReflectTest(String param) { System.out.println("this is a constructor with param :" + param + "!!!"); } /** * 创建对象 * * @param clazz * @param paramTypes:构造函数参数,如果为null表示调用无参函数 * @return * @throws Exception */ public Object createObject(Class clazz, Class[] paramTypes) throws Exception { Object obj = null; if (paramTypes == null) { // 无参构造函数 obj = clazz.newInstance(); } else { // 有参构造函数 Constructor con = clazz.getConstructor(paramTypes); obj = con.newInstance("Test String param"); } return obj; } /** * 激活对象的某个方法 * * @param obj * @param methodName * @throws Exception */ public void invokeMethod(Object obj, String methodName) throws Exception { Method[] methods = obj.getClass().getDeclaredMethods(); // 拿到当前类的全部方法,包括私有的和公有的 methods = obj.getClass().getMethods(); // 拿到当前类以及父类的所有公有方法 for (Method m : methods) { if (m.getName().equals(methodName)) { m.invoke(obj, new Object[] {}); // 调用方法 } } } public void getFileds(Object obj) throws Exception { Field[] fields = obj.getClass().getFields(); // 获取公有的属性 fields = obj.getClass().getDeclaredFields(); // 获取公有私有属性 for (Field f : fields) { System.out.println(f.getName()); } } public void overload(String s) { System.out.println("param is String :" + s); } public void overload(int i) { System.out.println("param is int :" + i); } public void testInvoke() { System.out.println("this is a method for invoke test!!!"); } public static void main(String[] args) throws Exception { ReflectTest rt = new ReflectTest(); Object obj = rt.createObject(ReflectTest.class, null); System.out.println("--------------"); obj = rt.createObject(ReflectTest.class, new Class[] { String.class }); System.out.println("--------------"); rt.invokeMethod(obj, "testInvoke"); System.out.println("--------------"); Method m = obj.getClass().getMethod("overload", int.class); m.invoke(obj, new Object[] { 1 }); System.out.println("--------------"); m = obj.getClass().getMethod("overload", String.class); m.invoke(obj, new Object[] { "test overload String" }); System.out.println("--------------"); rt.getFileds(obj); } }
利用java的反射机制可以进行简单的ORM即对象关系映射
如下面代码:
import java.lang.reflect.Method; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; import java.util.List; public class ORMTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { User user = (User) getObject( "select id as Id, name as Name from user where id=1", User.class); System.out.println(user); } public static List<Object> getObjects(String sql, Class clazz) throws Exception { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); String[] colNames = getColNames(rs); List<Object> objects = new ArrayList<Object>(); Method[] ms = clazz.getMethods(); while (rs.next()) { Object object = clazz.newInstance(); // for (int i = 0; i < colNames.length; i++) { String colName = colNames[i]; String methodName = "set" + colName; for (Method m : ms) { if (methodName.equals(m.getName())) { m.invoke(object, rs.getObject(colName)); break; } } objects.add(object); } } return objects; } finally { JdbcUtils.free(rs, ps, conn); } } private static String[] getColNames(ResultSet rs) throws Exception { ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); String[] colNames = new String[count]; for (int i = 1; i <= count; i++) { colNames[i - 1] = rsmd.getColumnLabel(i); } return colNames; } public static Object getObject(String sql, Class clazz) throws Exception { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); String[] colNames = getColNames(rs); Object object = null; Method[] ms = clazz.getMethods(); if (rs.next()) { object = clazz.newInstance(); for (int i = 0; i < colNames.length; i++) { String colName = colNames[i]; String methodName = "set" + colName; for (Method m : ms) { if (methodName.equals(m.getName())) { m.invoke(object, rs.getObject(colName)); break; } } } } return object; } finally { JdbcUtils.free(rs, ps, conn); } } }
在这个简单的ORM中,利用Java的反射机制动态创建实例,不需要事先知道要生成什么对象或对象集合,只需要在调用的时候转型(当然也可以使用jdk1.5的泛型技术),使用m.invoke(object, rs.getObject(colName))方法动态设置实例的属性,注意,在这个例子中,user类必须是一个标准的Javabean,具有各个属性的setter/getter方法以及一个没有参数的构造函数,上面例子中使用sql的别名来实现动态调用对象的方法,(Hibernate使用配置文件.hbm.xml文件完成数据库字段到javabean的映射),只需要在写查询sql的时候指定好别名就可以完成javabean属性的设置。
假如有另外一个类 Product
public class Product { private String id; private String name; private String manufatrue; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getManufatrue() { return manufatrue; } public void setManufatrue(String manufatrue) { this.manufatrue = manufatrue; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Product() { } }
这样我们在查询的时候只需要执行下面语句就可以获得封装好的Product对象/集合
Product product= (Product ) getObject("select id as Id, name as Name ,manufature as Manufature from product where id=1",Product .class);
这样的代码更具有动态性,不用每个查询写一个查询方法
发表评论
-
Mybatis3
2012-01-08 15:07 926看了一下Mybatis3,很简洁,不错,符合一贯的原则。 -
断网情况下主机系统与VMWare虚拟系统建立网络连接
2011-03-07 13:52 1630电脑不插网线设置主机系统与VMWare中linux系统 ... -
Oracle 9i10g编程艺术
2010-12-08 23:41 1027Oracle 9i10g编程艺术 -
SWT And JFace
2010-12-01 21:29 833The_Definitive_Guide_to_SWT_and ... -
SWT 定时器 update UI
2010-11-30 17:00 1813SWT如果涉及到线程中的数据互访,在一个线程中的触发事性中再去 ... -
Log4j XML 配置方式
2010-11-14 13:00 1505Log4j xml 配置文件log4j.xml[默认读取的文件 ... -
ThreadPool 线程池的使用
2010-10-20 21:41 7447import java.util.concurrent.B ... -
Java 大文件读取排序
2010-09-30 00:34 8227需求: csv文件中存在千万级数据,需要按照某一列进行排序 比 ... -
Oracle
2010-05-29 22:26 2456最近很有兴趣研究Oracle,今天把Oracle10g ... -
JArgp Command Line Argument Processor
2010-05-12 21:02 860http://sourceforge.net/projects ... -
Java 反射与内省
2009-09-27 22:52 3392一、java反射机制 JAVA反 ... -
分页工具类Page
2009-09-26 16:10 5788public class Page { public ... -
dom4j
2009-07-22 11:52 1075DOM4J是dom4j.org出品的一个开源XML解析 ... -
Javamail 详解
2009-07-21 22:17 2747最近研究JBPM的mail node节点,使用时老是发不出邮件 ... -
proxool数据连接池总结
2009-07-10 21:41 14643数据库连接池总结----Proxool 1、所需jar包: ... -
通过url下载文件HttpURLConnection
2009-07-08 15:48 17216import java.io.*; import jav ... -
web.xml配置五个有用的过滤器
2009-07-01 14:34 2955一、使浏览器不缓存页面的过滤器 Java代码 im ... -
Tomcat 配置JNDI数据源总结
2009-04-24 09:41 2006JNDI是J2EE中一个很重要的标准,通常我们是在J2EE编程 ... -
关于web.xml中的load-on-startup作用
2009-04-19 11:51 2922load-on-startup 元素在web应用启动的时候指定 ... -
Struts2学习笔记
2009-04-18 09:55 1341包括下面内容: 一、Struts2简介.doc 二、Stru ...
相关推荐
NULL 博文链接:https://lunzi.iteye.com/blog/1675871
利用Java反射和注解实现自定义的ORM,并提供相应的工具类自动生成CRUD的SQL语句,同时定义了完整的异常处理机制
Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf
使用动态代理,反射实现模拟实现ORM。使用数据库为MySQL5.0,开发环境为windows 10,Myeclipse10.6
采用Java反射技术实现ORM技术,通过操作对象就可以操作数据库。 本例子采用Eclipse , Java 7.0 , apache DBCP, Spring 3.1等开源框架, 数据库JDBC 采用oracle jdbc. 文件分为两部分, 一部分是基于Eclipse 的ORM的...
Java-JDBC【之】实现ORM,结果集映射实体类(ResultSet、注解、反射) 1.ORM实现思路 2.@Table、@Column、标识实体类 2.1.创建注解 @Table、@Column 2.2.标识实体类 2.3.数据库表 3.结果集解析,注解加反射填充实体...
工具简介:自己实现的简单的ORM工具,使用到的技术:JDBC+java反射机制。 简单的文档:rar解压后,DOC目录下:K-ORM.DOC
Java反射机制在数据持久层轻量级ORM框架中的应用研究
Creative ORM是Java中用于DAO / ORM映射的基于注释的小型框架。 使用反射来创建/映射实体
那么书写操作数据库的代码很简单:只需呼叫FacadeForDAO.findModel(表名)方法,在表名参数给出实际数据库中表的名称就可以返回一个包含对应POJO类的对象的集合--非常简单--输入表名得到Java对象的集合,然后根据需要...
关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...
没有ORM No ORM(NORM)软件包是一组基于JDBC构建的Java实用程序,用于以更安全和类型安全的方式更好地将SQL查询集成到Java代码中,而无需在Java中重新描述SQL表结构。 相反,其想法是使程序员能够在插入Java的类型...
JDBCSimpleORM一个简单的jdbc封装的orm,用到注解+反射,使用maven构建的java工程作为练手小项目还是可以学到不少东西
掌握Java数据库编程:掌握Java数据库编程的相关技术,如JDBC、SQL、ORM等,能够进行数据库操作和数据持久化。 掌握Java网络编程:掌握Java网络编程的相关技术,如Socket、UDP、TCP、IP等,能够进行网络通信和网络...
以前学的Java进行开发,多用到Mybatis,Hiberante等ORM框架,最近需要上手一个C#的项目,由于不是特别难,也不想再去学习C#的ORM框架,所以就想着用反射简单的实现一下ORM框架的内容,简单的增删改查,没有用到多表...
EF-ORM是一个轻量,便捷的Java ORM框架。并且具备若干企业级的应用特性,如分库分表、JTA事务等。 代码生成插件for eclipse(请在eclipse中Help/Install new software后输入地址并安装)...
MiniOrm-for-android 是一款简单,只能,灵活的android ORM框架,完全基于对象进行操作。主要帮助android程序员的快速开发。通过反射将查询的数据智能的转换成 Entity 。省去开发人员手动解析的时间。 功能特点...
Couchbase-Lite-ORM 这是在Java中为Couchbase Lite实现ORM的第一种方法。 我还在努力。主要观点Couchbase Lite的API相当不错,我不会将其隐藏。 Couchbase Lite ORM仅将文档转换为您的域对象,反之亦然。 您不需要...
noear::微型ORM框架(支持:java sql,xml sql,annotation sql;事务;缓存;监控;等...)可以嵌入到JVM脚本引擎(js, groovy, lua, python, ruby)及GraalVM支持的部分语言。0.2Mb(且是功能完整,方案丰富;可极...
JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...