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

/*
 *传入对象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_id
name
details
principal
creation_date
phone
web_addr
wechat
qq
creater
creation_time
updater
update_time
pic_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值