package abc;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Users users = new Users();
users.setId("a");
users.setName("b");
users.setPass("c");
Emplyee emplyee = new Emplyee();
emplyee.setDepNo("1");
emplyee.setEmpName("zhangsan");
emplyee.setEmpNo("1001");
new Test().save(emplyee);
}
/**
* 运行根据对象动态生成SQL语句
*
* @param Object
* object=emplyee;//多态 父类 对象名=子类对象;
*/
public void save(Object object) {
// 获取运行时你传递的对象的类型 封装成java.lang.Class类型 注意与class进行区别
// class1 包含了类的所有信息 如属性 方法 类名 属性的类型 属性的修饰符
Class class1 = object.getClass();
// 获取你传递的对象的简单类名
String className = class1.getSimpleName();
// 获取你传递的对象的所有属性的数组
Field[] fields = class1.getDeclaredFields();
StringBuffer stringBuffer = new StringBuffer("insert into " + className + "(");
// 遍历数组 每一个元素Field表示一个属性相关。属性的类型 属性的修饰符等
for (int i = 0; i < fields.length; i++) {
if (i == fields.length - 1) {
// fields[i].getName() 获取属性的名称 如果获取属性的类型用什么?? 查阅API
stringBuffer.append(fields[i].getName() + ") values (");
}
else {
stringBuffer.append(fields[i].getName() + ",");
}
}
// 遍历数组 每一个元素Field表示一个属性相关、根据属性拼写属性对应的getter方法,get+"属性首字母大写"+"属性后面的字符"
for (int i = 0; i < fields.length; i++) {
String fieldName = fields[i].getName();
// 属性对应的getter方法
String methodName = "get" + (fieldName.charAt(0) + "").toUpperCase() + fieldName.substring(1);
try {
// 运行时获取methodName方法,通过反射方式调用
// methodName 表示你要调用的方法的名称, null表示该方法定义的时候参数为空,
// 如果不为空,method.invoke的时候要传递相同类型的数据
Method method = class1.getMethod(methodName, null);
// method.invoke相当于对象名.方法名 object 表示该方法是哪个对象的 null表示调用的时候不需要参数
String value = method.invoke(object, null).toString();
if (i == fields.length - 1) {
stringBuffer.append("'" + value + "')");
}
else {
stringBuffer.append("'" + value + "',");
}
}
catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(stringBuffer);
}
}