//封装实体类
package common.dao;
public class BookDao {
private Integer bookId;
private String bookName;
private String bookAuth;
private int bookCount;
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuth() {
return bookAuth;
}
public void setBookAuth(String bookAuth) {
this.bookAuth = bookAuth;
}
public int getBookCount() {
return bookCount;
}
public void setBookCount(int bookCount) {
this.bookCount = bookCount;
}
}
package common.dao;
public class CarDao {
private Integer carId;
private String carName;
private Double carPrice;
public Integer getCarId() {
return carId;
}
public void setCarId(Integer carId) {
this.carId = carId;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public Double getCarPrice() {
return carPrice;
}
public void setCarPrice(Double carPrice) {
this.carPrice = carPrice;
}
}
//hbm,xml基本配置
<?xml version="1.0" encoding="UTF-8"?>
<mapping>
<class name="common.dao.BookDao" table="t_user">
<id name="bookId">
<generator class="increment"></generator>
<property name="bookName" column="book_Name"></property>
<property name="bookAuth" column="book_Auth"></property>
<property name="bookcount" column="book_Count"></property>
</id>
</class>
</mapping>
//有两种配置方式
package dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import common.dao.BookDao;
import common.dao.CarDao;
public class TestDao {
/* public void save(Object obj) throws Exception{
Class<? extends Object> clazz = obj.getClass();
//System.out.println(clazz);
String name = clazz.getName();
Field field = clazz.getDeclaredField(name);
//getsimpleName 获得类 的名称 获取类
String tableName = clazz.getSimpleName();
//System.out.println(tableName+" 1");
StringBuffer hql =new StringBuffer();
hql.append(" insert into "+tableName);
//System.out.println(clazz.getName()+" 2");
Field[] fields = clazz.getDeclaredFields();
StringBuffer value1=new StringBuffer();
StringBuffer value=new StringBuffer();
for (Field field : fields) {
value1.append(","+field.getName());
//获取权限 1-5 2代表私有的 getName 类里面的字段 getType字段的数据类型
//System.out.println(field.getModifiers()+"======"+field.getName()+"====="+field.getType());
Method method = clazz.getMethod(makeMethodName(field.getName()), null);
//System.out.println(method.getName());
Object invoke = method.invoke(obj, null);
System.out.println(method.getName()+":"+invoke);
if(invoke.getClass().getSimpleName().equals("String")){
invoke="‘"+invoke+"‘";
}
value.append(","+invoke);
}
//System.out.println(value.substring(1));
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method +" 3");
}
hql.append(" ( "+value1.toString().substring(1)+" )");
hql.append(" values("+value.toString().substring(1)+" )");
System.out.println(hql.toString());
}
//拼接私有化的get对象方法
private String makeMethodName(String fieldName) {
return "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
}*/
private static Map<String, Object> mapping = new HashMap<String, Object>();
static {
mapping.put("common.dao.BookDao", "t_book");
mapping.put("bookId", "book_Id");
mapping.put("bookName", "book_Name");
mapping.put("bookAuth", "book_Auth");
mapping.put("bookCount", "book_Count");
}
public static void save(Object obj) throws Exception{
//System.out.println(mapping.get("common.dao.BookDao"));
Class<? extends Object> clazz = obj.getClass();
String tableName = (String) mapping.get(clazz.getName());
StringBuffer sql = new StringBuffer("insert into ");
System.out.println(tableName);
if(tableName==null||"".equals(tableName)){
throw new Exception("对不起访问的实体对象不存在 "+obj.getClass().getSimpleName() );
}
//System.out.println(tableName);
sql.append(tableName);
StringBuffer valueName = new StringBuffer();
StringBuffer value= new StringBuffer();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// System.out.println(field.getName());
// System.out.println(mapping.get(field.getName()));
Method method = clazz.getMethod(MakeMathodName(field.getName()), null);
// System.out.println(method);
Object invoke = method.invoke(obj, null);
// System.out.println(invoke);
if(invoke.getClass().getSimpleName().equals("String")){
invoke="‘"+invoke+"‘";
}
valueName.append(","+mapping.get(field.getName()));
value.append(","+invoke);
}
sql.append(" ("+valueName.substring(1)+")");
sql.append(" values ("+value.substring(1)+")");
System.out.println(sql);
}
private static String MakeMathodName(String fieldName) {
//System.out.println("get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1));
return "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
}
public static void main(String[] args) throws Exception {
CarDao car = new CarDao();
car.setCarId(1);
car.setCarName("法拉利");
car.setCarPrice(12.5);
BookDao book = new BookDao();
book.setBookId(2);
book.setBookName("骆驼祥子");
book.setBookCount(1000);
book.setBookAuth("老舍");
TestDao testDao = new TestDao();
save(car);
save(book);
}
/*完成反射机制的三个条件 getClass 获取类的路径 */
/* public void save(Object obj) throws Exception{
// StringBuffer sql = new StringBuffer();
// Class<? extends Object> clazz = obj.getClass();
// String tableName = clazz.getSimpleName();
// sql.append("insert into "+tableName+" values (");
//// System.out.println(clazz.getName());
//// System.out.println(clazz.getSimpleName());
//// 获得类中的所有属性,课后作业:这个方法能不能获得继承的属性。
// Field[] fields = clazz.getDeclaredFields();
// StringBuffer values = new StringBuffer();
// for (Field field : fields) {
//// System.out.println(field.getModifiers() + ":" + field.getType() +":"+field.getName());
// Method method = clazz.getMethod(makeMethodName(field.getName()),null);
//// System.out.println(method.getName());
//// invoke表示动态调用当前方法,方法两个参数:调用谁的method,方法的参数值
// Object value = method.invoke(obj, null);
//// System.out.println(value);
// if(value.getClass().getSimpleName().equals("String")){
// value = "‘" + value + "‘";
// }
// values.append(value + ",");
// }
// sql.append(values.toString().substring(0,values.toString().length()-1));
// sql.append(")");
// System.out.println(sql.toString());
// }
//
// fieldName --> userName; getUserName()
public String makeMethodName(String fieldName){
return "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
}
public static void main(String[] args) throws Exception {
HibernateDAO hibernateDAO = new HibernateDAO();
UserDTO user = new UserDTO();
user.setId(1);
user.setUserName("admin");
user.setUserPwd("aaa");
user.setAge(21);
hibernateDAO.save(user);
BookDTO book = new BookDTO();
book.setId(21);
book.setBookName("西游记");
book.setPrice(20.00);
hibernateDAO.save(book);
}
public void save(Object obj) throws Exception{
StringBuffer sql = new StringBuffer();
sql.append("insert into ");
Class<? extends Object> clazz = obj.getClass();
String tableName = (String)mapping.get(clazz.getName());
if(tableName == null || tableName.equals("")){
throw new Exception("对不起,没有关于" + obj.getClass().getSimpleName() + "的hbm映射");
}
sql.append(tableName);
System.out.println(tableName);
sql.append(" (");
Field[] fields = clazz.getDeclaredFields();
StringBuffer values = new StringBuffer();
for (int i = 0; i < fields.length; i++) {
Field filed = fields[i];
Method method = clazz.getMethod(MakeMathodName(filed.getName()),null);
Object value = method.invoke(obj, null);
if(value.getClass().getSimpleName().equals("String")){
value = "‘"+value+"‘";
}
if(i == fields.length-1){
sql.append(mapping.get(filed.getName()));
values.append(value);
}else{
sql.append(mapping.get(filed.getName()) + ",");
values.append(value + ",");
}
}
sql.append(") values (");
sql.append(values.toString());
sql.append(")");
System.out.println(sql.toString());
}
*/
}
//百度百科
Java反射机制深入研究
Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
下面给出几个例子看看Reflection API的实际运用:
一、通过Class类获取成员变量、成员方法、接口、超类、构造方法等
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。