jinal 反射取值问题

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 (Exception 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 (Exception e) {
            e.printStackTrace();
        }return "";
    }

~~~///(^v^)\\\~~~

posted @ 2022-01-15 20:12  lanwf  阅读(57)  评论(0编辑  收藏  举报