一直感觉java的反射机制很强大,但是可用的地方不多。在android学习的时候,一直想实现挂断电话的功能,但是系统并没有提供开放的api接口,看了一下网上使用反射机制来实现该功能,确实很强大,很实用。
今天在对应的web开发中,客户端需要提交参数给服务器,自己已经写好了对应的bean文件,但是每一次都需要就其内部的key-value进行拼接,比较麻烦,突然想起了了反射机制,尝试了一下,确实非常的好用。下面看一下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Bean{ String name; String property; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } } |
上面是一个Bean类,有2个属性,在请求服务器时,我需要将其拼接为name=xxx&property=xxx,一个还好,很多这样的凭借就需要将其抽象出来了,下面使用反射机制对其拼接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; public class ParamsUtil { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException { //设置属性 Bean bean = new Bean(); bean.setName("blog.androiddevelop.cn"); bean.setProperty("master"); //获取所有变量 Field[] fields = bean.getClass().getDeclaredFields(); StringBuffer sb = new StringBuffer(""); for (int i = 0; i < fields.length; i++) { sb.append(fields[i].getName()); sb.append("="); sb.append(URLEncoder.encode(String.valueOf(fields[i].get(bean)), "UTF-8")); if (i < fields.length - 1) sb.append("&"); } System.out.println(sb.toString()); } } |
这样下来就将参数进行了拼接。当然,这样也有一定的弊端,要处理的对象里面的变量不能是很复杂的类型。
更多文章请前往小胖轩.