动态的生成对象:运行时绑定对象,优点是比较灵活,缺点是效率比较低下
例如:
Class.forName("com.mysql.jdbc.Driver.class");加载数据库驱动
获得对象Object obj = Class.forName("xxx").newInstance();
得到对象后就可以获得类的所有信息了
获得构造函数的方法
Constructor getConstructor(Class[] params)//根据指定参数获得public构造器
Constructor[] getConstructors()//获得public的所有构造器
Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器
Constructor[] getDeclaredConstructors()//获得public的所有构造器
获得类方法的方法
Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法
Method[] getMethods()//获得所有的public方法
Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法
Method[] getDeclaredMethods()//获得所以的public和非public方法
获得类中属性的方法
Field getField(String name)//根据变量名得到相应的public变量
Field[] getFields()//获得类中所以public的方法
Field getDeclaredField(String name)//根据方法名获得public和非public变量
Field[] getDeclaredFields()//获得类中所有的public和非public方法
比如我们要往数据库中插入一条记录,我们可以新建一个Java bean用来保存这组信息的类
比如数据库 中有个userinfo表,包含_id,name,age,address,email等信息
我们可以新建一个userinfo类类中分别含有这几个属性,再生成分别生成get和set方法
这样我们要插入一条user信息,我们可以先定义一个函数用来产生执行插入的SQL语句
String getInsertObjectSQL(Object obj){
StringBuilder sqlBuilder = new StringBuilder();
Class c = obj.getClass();
Method[] methods = c.getMethods();
Field[] fields = c.getFields();
String cName = c.getName();
String tableName = cName.subString(cName.lastIndexOf(".")+1,cName.length);
sqlBuilder.append("insert into "+tableName+"(");
List<String> mList = new ArrayList<String>();//方法名(也就是字段值)
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);
Object value = method.invoke(obj,null);
if(value instanceof String){
vList.add("\""+value+"\"");
}else{
vList.add(value);
}
}
for(int i=0; i<mList.size(); i++){
sqlBuilder.append(mList.get(i)+",");
}
sqlBuilder.append(") ");
for(int i=0; i<vList; i++){
sqlBuilder.append(vList.get(i)+",");
}
sqlBuilder.append(")");
}
return sqlBuilder.toString();
}
这样我们就通过反射得到了类的具体信息方便了查询操作的执行,减少了代码量和冗余度