JAVA反射获得属性及简单应用

来源:互联网 发布:淘宝菜鸟驿站 编辑:程序博客网 时间:2024/06/03 19:37
/* *传入对象t *这里的T为泛型 */public static <T> void getName(T t) {        //获得该对象的属性        Field[] filed = t.getClass().getDeclaredFields();        for (int i = 0; i < filed.length; i++) {            //打印属性名称            System.out.println(filed[i].getName());        }    }

全部代码
util.java

package util;import java.lang.reflect.Field;public class Util<T> {    public static <T> void getName(T t) {        // 获得该对象的属性        Field[] filed = t.getClass().getDeclaredFields();        for (int i = 0; i < filed.length; i++) {            System.out.println(filed[i].getName());        }    }    public static void main(String[] args) {        new Util<>().getName(new Netschool());    }}

Netschool.java

package util;import java.util.Date;/** * 网校信息表 *  * @author xiachenxiang * */public class Netschool {    /**     * 网校id     */    private String school_id;    /**     * 网校名称     */    private String name;    /**     * 网校简介     */    private String details;    /**     * 网校创建人(校长)     */    private String principal;    /**     * 网校创建日期     */    private Date creation_date;    /**     * 联系电话     */    private String phone;    /**     * 网站地址     */    private String web_addr;    /**     * 微信公众号     */    private String wechat;    /**     * QQ号     */    private String qq;    /**     * 创建者     */    private String creater;    /**     * 创建时间     */    private Date creation_time;    /**     * 修改人     */    private String updater;    /**     * 修改时间     */    private Date update_time;    /**     * 缩略图     */    private String pic_img;    public String getSchool_id() {        return school_id;    }    public void setSchool_id(String school_id) {        this.school_id = school_id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getDetails() {        return details;    }    public void setDetails(String details) {        this.details = details;    }    public String getPrincipal() {        return principal;    }    public void setPrincipal(String principal) {        this.principal = principal;    }    public Date getCreation_date() {        return creation_date;    }    public void setCreation_date(Date creation_date) {        this.creation_date = creation_date;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    public String getWeb_addr() {        return web_addr;    }    public void setWeb_addr(String web_addr) {        this.web_addr = web_addr;    }    public String getWechat() {        return wechat;    }    public void setWechat(String wechat) {        this.wechat = wechat;    }    public String getQq() {        return qq;    }    public void setQq(String qq) {        this.qq = qq;    }    public String getCreater() {        return creater;    }    public void setCreater(String creater) {        this.creater = creater;    }    public Date getCreation_time() {        return creation_time;    }    public void setCreation_time(Date creation_time) {        this.creation_time = creation_time;    }    public String getUpdater() {        return updater;    }    public void setUpdater(String updater) {        this.updater = updater;    }    public Date getUpdate_time() {        return update_time;    }    public void setUpdate_time(Date update_time) {        this.update_time = update_time;    }    public String getPic_img() {        return pic_img;    }    public void setPic_img(String pic_img) {        this.pic_img = pic_img;    }}

运行结果

school_idnamedetailsprincipalcreation_datephoneweb_addrwechatqqcreatercreation_timeupdaterupdate_timepic_img

java反射获得属性并赋值网上已经有很多方案了,我自己讲得也不会比人家的好了,我这里主要写一下java反射获得属性的简单应用吧。
这两天写代码的时候需要从map<String,Object>里面提取数据赋值给制定对象,不但枯燥,而且费时,然后我就写了一些工具类来代替这个

方案一

public static <T> T getObject(T t, Map<String, Object> map) {        try {            Field[] filed = t.getClass().getDeclaredFields();            for (int i = 0; i < filed.length; i++) {                //取消 Java 语言访问检查,简单的说就是可以访问private属性了                filed[i].setAccessible(true);                //判断类型并填充                if (filed[i].getType().equals(String.class)) {                    filed[i].set(t, map.get(filed[i].getName()));                } else if (filed[i].getType().equals(Date.class)) {                    filed[i].set(t, (Date) map.get(filed[i].getName()));                } else if (filed[i].getType().equals(Float.class)) {                    filed[i].set(t, ((BigDecimal) map.get(filed[i].getName())).floatValue());                } else if (filed[i].getType().equals(Integer.class)) {                    filed[i].set(t, (Integer) map.get(filed[i].getName()));                }            }        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }        //返回填充后的对象        return t;    }

这个方案的好处是直接获得对象,坏处是的加入这个工具类,而且根别人的代码有明细不同。

方案二

public static <T> void getStatementSet(T t) {        try {            //获得属性名            Field[] filed = t.getClass().getDeclaredFields();            for (int i = 0; i < filed.length; i++) {                //获得类名如 Netschool                String s = t.getClass().getName().substring(t.getClass().getName().lastIndexOf('.') + 1);                //1.将类名首字母小写 如netschool                //2.将当前属性名首字母大写 如School_id                //3.拼装并输出netschool.setSchool_id                //if语句根据不同的类型打印map.get语句                System.out.print(s.substring(0, 1).toLowerCase() + s.substring(1) + ".set"                        + filed[i].getName().substring(0, 1).toUpperCase() + filed[i].getName().substring(1));                if (filed[i].getType().equals(String.class)) {                    System.out.println("(map.get(\"" + filed[i].getName() + "\")+\"\");");                } else if (filed[i].getType().equals(Date.class)) {                    System.out.println("((Date)map.get(\"" + filed[i].getName() + "\"));");                } else if (filed[i].getType().equals(Float.class)) {                    System.out.println("(((BigDecimal)map.get(\"" + filed[i].getName() + "\")).floatValue());");                } else if (filed[i].getType().equals(Integer.class)) {                    System.out.println("((Integer)map.get(\"" + filed[i].getName() + "\"));");                }            }        } catch (IllegalArgumentException e) {            e.printStackTrace();        }    }

方案二的话缺点是看起来麻烦,但是优点是不用加入工具类并且代码和别人的相同
= = over

原创粉丝点击