在写一个简单框架的时候,搞了动态反射的实验,觉得挺好,贴出来,大家看看,以兹抛砖引玉。实际代码如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.uip.core;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 这里需要注意的是数据对象字段必须实现setter/getter
* @author SOLO Cui
*/
public class ReflectTrain{
private int xid ;
private String xname;
private Date xdate ;
private long salary ;
private String keyName ;
private String tableName;
public ReflectTrain(){
//super();
}
public static void main(String[] args) {
Object rt = new ReflectTrain();
if(rt instanceof ReflectTrain){
((ReflectTrain)rt).setXid(100);
((ReflectTrain)rt).setXname("reflect training");
((ReflectTrain)rt).setXdate(new Date());
((ReflectTrain)rt).setSalary(9889);
((ReflectTrain)rt).setKeyName("xid");
((ReflectTrain)rt).setTableName("mydbTable");
}
Method[] methods = rt.getClass().getMethods();
for(Method m:methods){
if(m.getName().contains("get")&&!m.getName().contains("KeyName")){
try {
System.out.print("return Value Type="+m.getReturnType().getName()+":"+m.getName()+":value="+m.invoke(rt)+"/n");
} catch (IllegalAccessException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Field[] fields = rt.getClass().getFields();
for(Field f:fields){
}
try {
Method xm = rt.getClass().getMethod("genInsertSQL");
try {
Object xStr = xm.invoke(rt);
System.out.println("动态SQL:"+xStr.toString());
} catch (IllegalAccessException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (NoSuchMethodException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(rt);
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append(this.getClass().getName()).append(":xid=").append(getXid())
.append(";xname=").append(getXname()).append(";xdate=").append(getXdate())
.append(";salary=").append(getSalary());
return sb.toString();
}
//获取表名
public String genInsertSQL(){
StringBuffer sb = new StringBuffer();
StringBuffer tsb = new StringBuffer();
sb.append("insert into ").append(this.getTableName()).append(" (");
Method[] methods = this.getClass().getMethods();
//以下2for可以封装成方法
for(Method m:methods){//字段名
if(m.getName().contains("get")
&&!m.getName().contains("KeyName")
&&!m.getName().contains("TableName")){
sb.append(m.getName().substring(3));
}
}
sb.append(") values(");
for(Method m:methods){//字段值,可以通过对值的类型实现有没有单引号
if(m.getName().contains("get")
&&!m.getName().contains("KeyName")
&&!m.getName().contains("TableName")){
String rvt =m.getReturnType().toString();
try {
if(rvt.contains("String")){
tsb.append("'").append(m.invoke(this)).append("',");
}else if(rvt.contains("int")||rvt.contains("Integer")||rvt.contains("long")||rvt.contains("Long")){
tsb.append(m.invoke(this)).append(",");
}else if(rvt.contains("Date")){
tsb.append("toDate('").append(m.invoke(this).toString()).append("'),");
}
} catch (IllegalAccessException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(ReflectTrain.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
String xtmp =tsb.toString();
sb.append(xtmp.substring(0, xtmp.length()-1));
sb.append(")");
return sb.toString();
}
/**
* @return the xid
*/
public int getXid() {
return xid;
}
/**
* @param xid the xid to set
*/
public void setXid(int xid) {
this.xid = xid;
}
/**
* @return the xname
*/
public String getXname() {
return xname;
}
/**
* @param xname the xname to set
*/
public void setXname(String xname) {
this.xname = xname;
}
/**
* @return the xdate
*/
public Date getXdate() {
return xdate;
}
/**
* @param xdate the xdate to set
*/
public void setXdate(Date xdate) {
this.xdate = xdate;
}
/**
* @return the salary
*/
public long getSalary() {
return salary;
}
/**
* @param salary the salary to set
*/
public void setSalary(long salary) {
this.salary = salary;
}
/**
* @return the kname
*/
public String getKeyName() {
return keyName;
}
/**
* @param kname the kname to set
*/
public void setKeyName(String kname) {
this.keyName = kname;
}
/**
* @return the tableName
*/
public String getTableName() {
return tableName;
}
/**
* @param tableName the tableName to set
*/
public void setTableName(String tableName) {
this.tableName = tableName;
}
}