java反射机制的应用_Java反射机制 应用实例

package cn.netjava.pojo;

public class UserInfo {

private int id;

private String name;

private String pwd;

private int age;

@Override

public String toString() {

return "UserInfo[id=" + id + ",name=" + name + ",pwd=" + pwd + ",age="

+ 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 String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

2、编写获得数据库连接的工厂类:

package cn.netjava.factory;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.mysql.jdbc.PreparedStatement;

public class Connect2DBFactory {

static String url = "jdbc:mysql://192.168.1.211:12760/atest";

static String name = "root";

static String password = "dream080";

static Connection conn = null;

private static Connect2DBFactory jdbcUtilSingle = null;

public static Connect2DBFactory getInstance() {

if (jdbcUtilSingle == null) {

synchronized (Connect2DBFactory.class) {

if (jdbcUtilSingle == null) {

jdbcUtilSingle = new Connect2DBFactory();

}

}

}

return jdbcUtilSingle;

}

private Connect2DBFactory() {

}

static {

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

public Connection getConnection() {

try {

conn = DriverManager.getConnection(url, name, password);

} catch (SQLException e) {

e.printStackTrace();

}

return conn;

}

public void release(ResultSet rs, PreparedStatement ps, Connection con) {

try {

if (rs != null) {

rs.close();

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (ps != null) {

ps.close();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (con != null) {

con.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

}

3、好戏开始啦,编写操作数据库的dao类

package cn.netjava.session;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import cn.netjava.factory.Connect2DBFactory;

import cn.netjava.pojo.UserInfo;

public class NetJavaSession {

/**

* 解析出保存对象的sql语句

*

* @param object

* :需要保存的对象

* @return:保存对象的sql语句

*/

public

static String getSaveObjectSql(Object object)

{

// 定义一个sql字符串

String sql = "insert into ";

// 得到对象的类

Class c = object.getClass();

// 得到对象中所有的方法

Method[] methods = c.getMethods();

// 得到对象中所有的属性

Field[] fields = c.getFields();

// 得到对象类的名字

String cName = c.getName();

// 从类的名字中解析出表名

String tableName = cName.substring(cName.lastIndexOf(".") + 1, cName.length());

sql += tableName + "(";

List mList = new ArrayList();

List vList = new ArrayList();

for (Method method : methods) {

String mName = method.getName();

if (mName.startsWith("get") && !mName.startsWith("getClass")) {

String fieldName = mName.substring(3, mName.length());

mList.add(fieldName);

System.out.println("字段名字----->" + fieldName);

try {

Object value = method.invoke(object, null);

System.out.println("执行方法返回的值:" + value);

if (value instanceof String) {

vList.add("\"" + value + "\"");

System.out.println("字段值------>" + value);

} else {

vList.add(value);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

for (int i = 0; i < mList.size(); i++) {

if (i < mList.size() - 1) {

sql += mList.get(i) + ",";

} else {

sql += mList.get(i) + ") values(";

}

}

for (int i = 0; i < vList.size(); i++) {

if (i < vList.size() - 1) {

sql += vList.get(i) + ",";

} else {

sql += vList.get(i) + ")";

}

}

return sql;

}

public static List getDatasFromDB(String tableName, int Id) {

return null;

}

/**

* 将对象保存到数据库中

*

* @param object

* :需要保存的对象

* @return:方法执行的结果;1:表示成功,0:表示失败

*/

public int saveObject(Object object) {

Connection con = Connect2DBFactory.getInstance().getConnection();

String sql = getSaveObjectSql(object);

try {

Statement statement = (Statement) con.createStatement();

PreparedStatement psmt = con.prepareStatement(sql);

psmt.executeUpdate();

return 1;

} catch (SQLException e) {

e.printStackTrace();

return 0;

}

}

/**

* 从数据库中取得对象

*

* @param arg0

* :对象所属的类

* @param id

* :对象的id

* @return:需要查找的对象

*/

public Object getObject(String className, int Id) {

// 得到表名字

String tableName = className.substring(className.lastIndexOf(".") + 1, className.length());

// 根据类名来创建Class对象

Class c = null;

try {

c = Class.forName(className);

} catch (ClassNotFoundException e1) {

e1.printStackTrace();

}

// 拼凑查询sql语句

String sql = "select * from " + tableName + " where Id=" + Id;

System.out.println("查找sql语句:" + sql);

// 获得数据库链接

Connection con = Connect2DBFactory.getInstance().getConnection();

// 创建类的实例

Object obj = null;

try {

Statement stm = con.createStatement();

// 得到执行查寻语句返回的结果集

ResultSet set = stm.executeQuery(sql);

// 得到对象的方法数组

Method[] methods = c.getMethods();

// 遍历结果集

while (set.next()) {

obj = c.newInstance();

// 遍历对象的方法

for (Method method : methods) {

String methodName = method.getName();

// 如果对象的方法以set开头

if (methodName.startsWith("set")) {

// 根据方法名字得到数据表格中字段的名字

String columnName = methodName.substring(3, methodName.length());

// 得到方法的参数类型

Class[] parmts = method.getParameterTypes();

if (parmts[0] == String.class) {

// 如果参数为String类型,则从结果集中按照列名取得对应的值,并且执行改set方法

method.invoke(obj, set.getString(columnName));

}

if (parmts[0] == int.class) {

method.invoke(obj, set.getInt(columnName));

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

return obj;

}

}

4、开始测试效果怎么样:

package cn.netjava.tester;

import cn.netjava.pojo.UserInfo;

import cn.netjava.session.NetJavaSession;

public class Tester {

public static void main(String args[]) {

// 获得NetJavaSession对象

NetJavaSession session = new NetJavaSession();

// 创建一个UserInfo对象

UserInfo user = new UserInfo();

// 设置对象的属性

user.setId(6988);

user.setAge(44);

user.setPwd("pwd");

user.setName("champion");

// 将对象保存到数据库中

String sql = session.getSaveObjectSql(user);

System.out.println("保存对象的sql语句:" + sql);

// 查找对象

UserInfo userInfo = (UserInfo) session.getObject(

"cn.netjava.pojo.UserInfo", 6988);

System.out.println("获取到的信息:" + userInfo);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值