java反射

来源:互联网 发布:plc编程题目 编辑:程序博客网 时间:2024/05/01 01:28

动态的生成对象:运行时绑定对象,优点是比较灵活,缺点是效率比较低下


例如:

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();

}


这样我们就通过反射得到了类的具体信息方便了查询操作的执行,减少了代码量和冗余度

0 0
原创粉丝点击