旧代码(省略了其他无关代码)
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); } }