一、在JDK中,主要由以下来实现Java反射机制,这些类都位于 java.lang.reflect
包中:
- Class类: 代表一个类
- Field类: 代表类的成员变量
- Method类: 代表类的方法
- Constructor类: 代表类的构造方法
- Array类:提供了动态创建数组,以及访问数组元素的静态方法
二、反射实现表单数据的封装:
假设以用户登录为例
①:先新建一个用户实体类
/*
* 用户登录表单数据
* */
public class User {
private String loginName; // 姓名
private String loginType; // 类型
private String password; // 密码
private String verifyCode; // 验证码
// get/set方法 省略,自行加上
}
②:表单数据的封装
//表单对象
List <NameValuePair> form = new ArrayList<NameValuePair>();
// form表单封装,利用反射遍历赋值,并调用方法
Field[] declaredFields = user.getClass().getDeclaredFields(); // 获得所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
for (int i = 0; i < declaredFields.length ; i++) {
String name = declaredFields[i].getName(); // 获取属性名
String methodName = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写,方便构造get,set方法
try {
Method method = user.getClass().getMethod("get"+ methodName); // 方法拼接获取实体类中的 get 方法
try {
form.add(new BasicNameValuePair(name,(String)method.invoke(user))); // 数据封装
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
// 请求封装
try {
// 必须写明编码格式 UTF8
httpPost.setEntity(new UrlEncodedFormEntity(form,"utf8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
这样即可实现无论实体类有多少成员变量,都能一步到位封装成表单数据