jfinal 类都是model 模型 ,Model是ActiveRecord中最重要的组件之一,基于ActiveRecord的Model无需定义属性,所以通过方法反射取值的方式是获取不到的。
所以要想通过属性反射取值是取不到的,只能通过方法取值来解决问题
关键在于 利用字段+拼接找到相应的方法
/** * 反射取值 * @param t 实例对象 * @param field 取值字段 * @return */ public String getMethodValueByClass(T t,String field) { //将字段首字母大写并取出 x > X String firstUpper = String.valueOf(field.charAt(0)).toUpperCase(); //利用StringBuilder 特有的 replace 方法转换将 xxx > Xxx StringBuilder sb = new StringBuilder(field); sb.replace(0,1,firstUpper); //拼接新的字段 getXxx field = "get"+sb.toString(); try { //取值 Class clazz = t.getClass(); return clazz.getMethod(field).invoke(t).toString(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return ""; } /** * 方法赋值 * @param t 实例对象 * @param field 字段 * @param value 赋的值 * @return */ public String setMethodValueByClass(T t, String field, String value) { String s1 = String.valueOf(field.charAt(0)).toUpperCase(); StringBuilder sb = new StringBuilder(field); sb.replace(0, 1, s1); field = "set" + sb.toString(); try { Class clazz = t.getClass(); //设置方法参数String, 可设置多个参数,clazz.getMethod(field, String.class,Integer.class....) 等对应你属性里面形参即可 Method method = clazz.getMethod(field, String.class); //填充值,对应以上参数个数即可 return method.invoke(t, value).toString(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return ""; }
~~~///(^v^)\\\~~~