Java反射机制之初见端倪
这里模拟一下Hibernate的save,初试OR Mapping。
首先建立JavaBean student类。
student.java
package hibernate.source;public class student {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;}}
编写测试方法,要求直接将student存入数据库。
TestStudent.java
import hibernate.source.student;public class TestStudent {public static void main(String args[]) throws Exception {student cat=new student();cat.setAge(22);cat.setName("Jing");cat.setId(26);Session session=new Session();session.save(cat);}
}
我们模拟了Hibernate中的Session,这里我们需要自己编写Session类来实现将student存入数据库。
Session.java
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
import hibernate.source.student;public class Session {String TableName="student";Map<String,String> cfs=new HashMap<String,String>();String[] MethodName;Session() {cfs.put("id", "id");cfs.put("name", "name");cfs.put("age", "age");MethodName=new String[cfs.size()];}public void save(student cat) throws Exception{String sql=createSql();Class.forName("com.mysql.jdbc.Driver");Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test");PreparedStatement pst=conn.prepareStatement(sql);for(int i=0;i<cfs.size();i++) {Method m=cat.getClass().getMethod(MethodName[i]);Class<?> r=m.getReturnType();System.out.println(m.getName());System.out.println(r.getName());if(r.getName().equals("java.lang.String")) {String tem=(String)m.invoke(cat);pst.setString(i+1, tem);}if(r.getName().equals("int")) {Integer tem=(Integer)m.invoke(cat);pst.setInt(i+1,tem);} }pst.execute();pst.close();conn.close();}public String createSql() {String sql1="";for(int i=0;i<cfs.size();i++){ sql1+=cfs.keySet().toArray()[i]+",";String property=(String)cfs.values().toArray()[i];String s=property.substring(0, 1).toUpperCase();MethodName[i]="get"+s+property.substring(1, property.length());System.out.println(MethodName[i]);}String sql2="";for(int i=0;i<cfs.size();i++) {sql2+="?"+","; }sql2=sql2.substring(0, sql2.length()-1);sql1=sql1.substring(0, sql1.length()-1);String sql="insert into "+TableName+" ("+sql1+")"+" values"+" ("+sql2+")";System.out.println(sql); return sql;}}
思路:
1.拼接SQL语句,将用在Preparedstatement中。
2.需要将student的属性设到Preparedstatement中,问题是怎么实现呢?
3.利用Java反射机制。
1)新建MethodName数组,目的将student中的方法名获得并存入MethodName中。
2)Method类登场,让student类通过MethodName取得对应的方法,返回给Mehod对象。
3)Method类invoke(Class), 将反射执行student对应的方法,获取对应属性值。
转载于:https://www.cnblogs.com/jackhub/archive/2012/11/29/3147221.html
Java反射机制之初见端倪相关推荐
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于:2012-09-15 ...
- Java反射机制分析指南
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- 反射 字段_详解面试中常考的 Java 反射机制
反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性和方法. 反射是一项高级 ...
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...
方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...
- java基础-java反射机制
2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...
- 利用java反射机制进行对象操作
我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...
- java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...
- java继承 映射_hibernate继承关系映射和java反射机制的运用
转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...
最新文章
- 重磅:腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
- 数据蒋堂 | 再谈有序分组
- 简简单单实践ERD Commander2005破解Windows密码
- android启用其他应用程序,杀死Android上的另一个应用程序?
- sql查询语句for xml path语法
- 线程间通信 GET POST
- LinQ To Object 基本用法
- 300 秒搞定第一超算 1 万年的计算量,量子霸权时代已来? | CSDN 博文精选
- (二)UML语言概述
- matlab质心定位算法,一种改进的质心定位算法
- 生物素PEG生物素,Biotin-PEG-Biotin
- Word和Excel齐发力,将多个单元格的文本内容合并到一个单元格
- 用python实现成绩录入
- 转:通信十年:前辈对通信行业的分析与经历
- STM32之vl53l0x读取距离
- 【JAVA-Mybatis】MyBatis 常用逻辑符号转换
- WIN7文件夹共享步骤
- 软件测试的日常工作是什么
- 【翻译】Aggregated Residual Transformations for Deep Neural Networks
- 腾讯QQ2007 beta1┊解决Windows Vista下QQ基本的兼容性问题┊纯净绿色特别版
热门文章
- nginx变量传递给php,php-从nginx将参数传递给auth_request模块
- 四阶行列式计算_【免费专题课】线代之行列式的计算
- 远程桌面对方计算机无法远程,win7开启QQ远程协助无法连接对方电脑如何解决
- Node.js 被分叉出一个项目 — Ayo.js,肿么了
- sql镶嵌查询_SQL语句 - 嵌套查询
- 【MySQL】多表查询策略(多表联查子查询)
- n9_Adding Interactivity Animating Plots_BeautifulSoup_Interactive backends_Tkinter_Plot.ly_FFmpeg
- linux查看端口pvid,交换机端口及常见问题定位(二)
- 最新版网页浏览器Flash插件离线版安装程序下载
- 再见安卓 鸿蒙,鸿蒙os 再见安卓