- 浏览: 254516 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
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 988看了一下Mybatis3,很简洁,不错,符合一贯的原则。 -
断网情况下主机系统与VMWare虚拟系统建立网络连接
2011-03-07 13:52 1680电脑不插网线设置主机系统与VMWare中linux系统 ... -
Oracle 9i10g编程艺术
2010-12-08 23:41 1075Oracle 9i10g编程艺术 -
SWT And JFace
2010-12-01 21:29 889The_Definitive_Guide_to_SWT_and ... -
SWT 定时器 update UI
2010-11-30 17:00 1871SWT如果涉及到线程中的数据互访,在一个线程中的触发事性中再去 ... -
Log4j XML 配置方式
2010-11-14 13:00 1557Log4j xml 配置文件log4j.xml[默认读取的文件 ... -
ThreadPool 线程池的使用
2010-10-20 21:41 7498import java.util.concurrent.B ... -
Java 大文件读取排序
2010-09-30 00:34 8280需求: csv文件中存在千万级数据,需要按照某一列进行排序 比 ... -
Oracle
2010-05-29 22:26 2517最近很有兴趣研究Oracle,今天把Oracle10g ... -
JArgp Command Line Argument Processor
2010-05-12 21:02 899http://sourceforge.net/projects ... -
Java 反射与内省
2009-09-27 22:52 3468一、java反射机制 JAVA反 ... -
分页工具类Page
2009-09-26 16:10 5822public class Page { public ... -
dom4j
2009-07-22 11:52 1110DOM4J是dom4j.org出品的一个开源XML解析 ... -
Javamail 详解
2009-07-21 22:17 2832最近研究JBPM的mail node节点,使用时老是发不出邮件 ... -
proxool数据连接池总结
2009-07-10 21:41 14723数据库连接池总结----Proxool 1、所需jar包: ... -
通过url下载文件HttpURLConnection
2009-07-08 15:48 17266import java.io.*; import jav ... -
web.xml配置五个有用的过滤器
2009-07-01 14:34 3033一、使浏览器不缓存页面的过滤器 Java代码 im ... -
Tomcat 配置JNDI数据源总结
2009-04-24 09:41 2044JNDI是J2EE中一个很重要的标准,通常我们是在J2EE编程 ... -
关于web.xml中的load-on-startup作用
2009-04-19 11:51 2956load-on-startup 元素在web应用启动的时候指定 ... -
Struts2学习笔记
2009-04-18 09:55 1377包括下面内容: 一、Struts2简介.doc 二、Stru ...
相关推荐
这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...
总之,通过Java反射和注解自定义ORM框架,可以实现更加灵活、定制化的数据库操作。这种方式不仅提高了开发效率,还降低了代码的耦合度,使得项目维护更加容易。在实际应用中,可以根据项目的具体需求进行适当的调整...
在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...
本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和反射的基本概念。动态代理是在运行时创建一个接口的实现类,这个实现类会调用...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
由于Java反射机制允许程序在运行时构造和访问任何类的属性和方法,它为Reflect-ORM框架提供了实现的理论基础。通过反射,框架可以动态地读取对象的属性信息,将这些信息转换为数据库的表结构,以及将数据库查询结果...
在本篇“基于Java简易ORM框架实现(二)”中,我们将深入探讨如何构建一个简单的对象关系映射(Object-Relational Mapping,ORM)框架。ORM框架是Java开发中常用的一种技术,它允许开发者以面向对象的方式操作数据库,...
在本案例中,"简单实现ORM"是指通过反射机制来实现对象关系映射(Object-Relational Mapping),这是一种将数据库中的数据与Java对象之间建立映射关系的技术,使得开发者可以更方便地操作数据库。 ORM的主要目的是...
Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够动态调用方法和创建对象。这个技术的核心在于`java.lang.reflect`包中的类,如`Class`、`...
Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年1月版)进行深度解析,帮助读者更好地...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
Java反射机制是在运行时通过Reflection APIs获取任何已知类的内部信息,包括类的修饰符(如public、static等)、超类、实现的接口、字段和方法的全部信息。它还允许在运行时改变字段内容、调用方法,甚至创建未知类...
采用Java反射技术实现ORM技术,通过操作对象就可以操作数据库。 本例子采用Eclipse , Java 7.0 , apache DBCP, Spring 3.1等开源框架, 数据库JDBC 采用oracle jdbc. 文件分为两部分, 一部分是基于Eclipse 的ORM的...
Java反射详解 在Java编程语言中,反射是一个强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,甚至能够在运行时创建和访问这些对象。这种能力使得Java成为一种动态语言,增强了代码的灵活性和可扩展...
Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象并调用其方法。在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`、`Constructor`、`...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够在运行时创建和访问这些类的对象。在Java中,反射提供了对类对象的元数据(metadata)的访问,使得我们可以...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心在于`java.lang.Class`类以及相关的类和接口,如`java.lang.reflect`包下...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这种能力使得Java代码能够具备动态性,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及...