嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-12-31 1884 次浏览 标签 : Java

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

旧代码(省略了其他无关代码)

public class ApiProtocol {

    private int                       build      = 101;
    private String                    appVersion = "1.0";
    private String                    channel    = "mengkang.net";
    private String                    geo        = null;
    private String                    clientIP   = null;
    private String                    serverIP   = null;
    private String                    api        = null;
    private String                    auth       = null;
    private int                       offset     = 0;
    private int                       limit      = 10;
    private Map<String, List<String>> parameters = null;

    private void decodeRequestParameters(){

        final String build      = "build";
        final String appVersion = "appVersion";
        final String channel    = "channel";
        final String api        = "api";
        final String geo        = "geo";
        final String offset     = "offset";
        final String limit      = "limit";
        final String auth       = "auth";

        if (this.parameters.containsKey(build)) {
            try {
                this.build = Integer.parseInt(this.parameters.get(build).get(0));
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } finally {
                this.parameters.remove(build);
            }
        }

        if (this.parameters.containsKey(appVersion)) {
            this.appVersion = this.parameters.get(appVersion).get(0);
            this.parameters.remove(appVersion);
        }

        if (this.parameters.containsKey(channel)) {
            this.channel = this.parameters.get(channel).get(0);
            this.parameters.remove(channel);
        }

        if (this.parameters.containsKey(api)) {
            this.api = this.parameters.get(api).get(0);
            this.parameters.remove(api);
        }

        if (this.parameters.containsKey(geo)) {
            this.geo = this.parameters.get(geo).get(0);
            this.parameters.remove(geo);
        }

        if (this.parameters.containsKey(offset)) {
            try {
                this.offset = Integer.parseInt(this.parameters.get(offset).get(0));
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } finally {
                this.parameters.remove(offset);
            }
        }

        if (this.parameters.containsKey(limit)) {
            try {
                this.limit = Integer.parseInt(this.parameters.get(limit).get(0));
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } finally {
                this.limit = (this.limit > 30) ? 30 : this.limit; // 防止被人一次性请求大量数据
                this.parameters.remove(limit);
            }
        }

        if (this.parameters.containsKey(auth)) {
            this.auth = this.parameters.get(auth).get(0);
            this.parameters.remove(auth);
        }
    }
}

使用反射之后

public void decodeRequestParameters() {
    Field[] fields = this.getClass().getDeclaredFields();

    for (int i = 0, length = fields.length; i < length; i++) {
        Field field = fields[i];
        String filedName = field.getName();

        if (!this.parameters.containsKey(filedName)) {
            continue;
        }

        String fieldType = field.getType().getName();
        field.setAccessible(true);
        try {
            if (fieldType.endsWith("int")) {
                field.set(this, Integer.parseInt(this.parameters.get(filedName).get(0)));
            } else if (fieldType.endsWith("float")) {
                field.set(this, Float.parseFloat(this.parameters.get(filedName).get(0)));
            } else if (fieldType.endsWith("long")) {
                field.set(this, Long.parseLong(this.parameters.get(filedName).get(0)));
            } else if (fieldType.endsWith("double")) {
                field.set(this, Double.parseDouble(this.parameters.get(filedName).get(0)));
            } else {
                field.set(this, this.parameters.get(filedName).get(0));
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        this.parameters.remove(filedName);
    }
}


嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表