首先,我来段反射代码:/******
* @introduce:
* 1、这个类是Hibernate中模拟Session的部分
* 2、这个类,由于有些部分与问题无关,
* 为了不影响阅读,我这里把与问题相关的核心部分发出来!
*/
public class MySession {
String tableName = "_Students";//表名
Map<String , String> cfg = new HashMap<String , String>();//<表字段名,实体属性名>
String[] mName;//将实体中getXxx()用数组表示
private Student s;
//初始化
public MySession(){//这是MySession的构造函数
cfg.put("_id", "id");
cfg.put("_name", "name");
cfg.put("_age", "age");
mName = new String[cfg.size()];
}
public void save(Student s)throws Exception
{
String sql = createSQL();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","weidu23");
PreparedStatement pst = conn.prepareStatement(sql);
for(int i =0 ; i <mName.length;i++)
{
String m = mName[i];
Method methodName = s.getClass().getMethod(m);
Class<?> returnType = methodName.getReturnType();
if( returnType.getName().equals("int"))
{
pst.setInt(i+1, (Integer)methodName.invoke(s));
}
else if(returnType.getName().equals("java.lang.String"))
{
pst.setString(i+1, (String)methodName.invoke(s));
}
else if(returnType.getName().equals("java.sql.Date"))
{
pst.setDate(i+1,(java.sql.Date)methodName.invoke(s));
}
else
;
}
pst.executeQuery();
pst.close();
pst.close();
}
private String createSQL() {
//SQL:insert into _Students(_id,_age,_name) values(?,?,?)
//str1代表的是【_id,_age,_name】部分
String str1 = "" ;
int index = 0 ;
for(String s:cfg.keySet()){
str1 += s+"," ;
String v = cfg.get(s);
String m = "get" + Character.toUpperCase(v.charAt(0)) + v.substring(1);
mName[index] = m ;
index++;
}
str1 = str1.substring(0, str1.length()-1);
System.out.println(str1);
//str2代表的是【?,?,?】部分
String str2 = "";
//拼接str2
for(int i=0;i<cfg.size();i++){
str2 += "?"+",";
}
str2 = str2.substring(0,str2.length()-1);
System.out.println(str2);
//组装SQL语句
String sql = "insert into " + tableName + "(" + str1 + ")" + " values(" + str2 + ")";
System.out.println(sql);
return sql;
}
}
----------------------------------- 问题1、 -------------------------------------------
问题1:
我注意到,这里有一个Method methodName = s.getClass().getMethod(m);
我查了下JDK1.6的API,发现,Class的getMethod有两个,
一个是:public Method getMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
另一个是:public Method[] getMethods()
throws SecurityException而然,这里用的s.getClass().getMethod(m);却只用一个参数!!!我比较愚钝,或说基础没打好,很内疚的向各位请教!!!-------------------------------- 问题2、 -----------------------------
问题2:
代码里有一个mName = new String[cfg.size()];这里的mName应该只是创建了一个String数组,但是数组里应该没有内容吧 !
然而,我却发现在save(Student s)函数里,却能够String m = mName[i];
Method methodName = s.getClass().getMethod(m);
这里m = mName[i],这不错,但是mName[i]本身没有内容啊,怎么反射的了 ???Java
* @introduce:
* 1、这个类是Hibernate中模拟Session的部分
* 2、这个类,由于有些部分与问题无关,
* 为了不影响阅读,我这里把与问题相关的核心部分发出来!
*/
public class MySession {
String tableName = "_Students";//表名
Map<String , String> cfg = new HashMap<String , String>();//<表字段名,实体属性名>
String[] mName;//将实体中getXxx()用数组表示
private Student s;
//初始化
public MySession(){//这是MySession的构造函数
cfg.put("_id", "id");
cfg.put("_name", "name");
cfg.put("_age", "age");
mName = new String[cfg.size()];
}
public void save(Student s)throws Exception
{
String sql = createSQL();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","weidu23");
PreparedStatement pst = conn.prepareStatement(sql);
for(int i =0 ; i <mName.length;i++)
{
String m = mName[i];
Method methodName = s.getClass().getMethod(m);
Class<?> returnType = methodName.getReturnType();
if( returnType.getName().equals("int"))
{
pst.setInt(i+1, (Integer)methodName.invoke(s));
}
else if(returnType.getName().equals("java.lang.String"))
{
pst.setString(i+1, (String)methodName.invoke(s));
}
else if(returnType.getName().equals("java.sql.Date"))
{
pst.setDate(i+1,(java.sql.Date)methodName.invoke(s));
}
else
;
}
pst.executeQuery();
pst.close();
pst.close();
}
private String createSQL() {
//SQL:insert into _Students(_id,_age,_name) values(?,?,?)
//str1代表的是【_id,_age,_name】部分
String str1 = "" ;
int index = 0 ;
for(String s:cfg.keySet()){
str1 += s+"," ;
String v = cfg.get(s);
String m = "get" + Character.toUpperCase(v.charAt(0)) + v.substring(1);
mName[index] = m ;
index++;
}
str1 = str1.substring(0, str1.length()-1);
System.out.println(str1);
//str2代表的是【?,?,?】部分
String str2 = "";
//拼接str2
for(int i=0;i<cfg.size();i++){
str2 += "?"+",";
}
str2 = str2.substring(0,str2.length()-1);
System.out.println(str2);
//组装SQL语句
String sql = "insert into " + tableName + "(" + str1 + ")" + " values(" + str2 + ")";
System.out.println(sql);
return sql;
}
}
----------------------------------- 问题1、 -------------------------------------------
问题1:
我注意到,这里有一个Method methodName = s.getClass().getMethod(m);
我查了下JDK1.6的API,发现,Class的getMethod有两个,
一个是:public Method getMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
另一个是:public Method[] getMethods()
throws SecurityException而然,这里用的s.getClass().getMethod(m);却只用一个参数!!!我比较愚钝,或说基础没打好,很内疚的向各位请教!!!-------------------------------- 问题2、 -----------------------------
问题2:
代码里有一个mName = new String[cfg.size()];这里的mName应该只是创建了一个String数组,但是数组里应该没有内容吧 !
然而,我却发现在save(Student s)函数里,却能够String m = mName[i];
Method methodName = s.getClass().getMethod(m);
这里m = mName[i],这不错,但是mName[i]本身没有内容啊,怎么反射的了 ???Java
public Method getMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
每个Method肯定有Name,但是不一定非得有参数
class Test
{
public void fun();
public void fun(int a);
public void fun(int a,String b)
}Test.getClass().getMethod("fun"); //first
Test.getClass().getMethod("fun",Integer.class); //Second
Test.getClass().getMethod("fun",Integer.class,String.class); //Third
可以看一下这往篇帖子,说的挺清楚的http://blog.csdn.net/justinavril/article/details/4674305
2 String数组初始化都是null值