一直感觉java的反射机制非常强大,可是可用的地方不多。在android学习的时候。一直想实现挂断电话的功能,可是系统并没有提供开放的api接口,看了一下网上使用反射机制来实现该功能,确实非常强大,非常有用。

 

今天在相应的web开发中,client须要提交參数给server,自己已经写好了相应的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个属性,在请求server时,我须要将其拼接为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,
            IllegalAccessExceptionUnsupportedEncodingException {
         //设置属性
        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 (< fields.length - 1)
                sb.append("&");
        }
        System.out.println(sb.toString());
    }
}

这样下来就将參数进行了拼接。当然,这样也有一定的弊端,要处理的对象里面的变量不能是非常复杂的类型。


很多其它文章请前往小胖轩.