很多时候定义了一些常量,又想根据常量生成一些想要的方法,可以当作一些参考
工具类-1
/**
*
* 判断常量含有几个下划线,其实没必要用,看需要选择吧
**/
public static int hasLen(String str) {
if(StringUtils.isBlank(str))
return 0;
return str.length() - str.replaceAll(separator, "").length();
}
工具类-2
/**
*
* 驼峰命名方法
**/
public static String createMethodName(String field) {//1 例如audi_best_car
int hasSep = hasLen(field);
if(hasSep > 0) {//此处可不用工具类-1做判断,看自己需要和理解吧
int separatorIndex = field.indexOf(separator);//第一个下划线的位置
String tempStr = field.replaceFirst(separator, "");//1 替换 变为audibest_car
//tempStr.substring(0, separatorIndex) = audi
//tempStr.substring(separatorIndex++, separatorIndex).toUpperCase() = B
//tempStr.substring(separatorIndex, tempStr.length()).toLowerCase() = est_car
//field = audiBest_car
field = tempStr.substring(0, separatorIndex)
.concat(tempStr.substring(separatorIndex++, separatorIndex).toUpperCase())
.concat(tempStr.substring(separatorIndex, tempStr.length()).toLowerCase());
//之后递归重复上面的变为 audiBestCar
return createMethodName(field);
}
return field;
}
**接着反射拿变量就好了 **
//getFields() 获取公开的字段
//getDeclaredFields() 获取所有的
Field[] fields = WXPayParamsConstants.class.getFields();
for (Field field : fields) {
String fieldName = field.getName();
if(StringUtils.isBlank(fieldName))
continue;
String value = String.valueOf(field.get(null)), fieldChangeName = createMethodName(value);
//此处我前面有个put 所以把第一个字母在转为大写
String methodName = fieldChangeName.substring(0,1).toUpperCase().concat(fieldChangeName.substring(1, fieldChangeName.length()));
sb.append(" public WXPayParams put" + methodName + "(String " +fieldChangeName + ") { \r\n");
sb.append(" return commonPut(" + fieldName + ", " + fieldChangeName + "); \r\n");
sb.append(" } \n \r");
}
至此就完了,一个很简单的小demo,肯定有更好的,算是敲门砖,给别人一点思路吧,有云雾,那边轻轻的拨开即可。
我的完整class
/**
*
*/
package com.wscrys.pay.wx.support;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import org.apache.commons.lang3.StringUtils;
/**
* <p>微信支付静态常量类</p>
* @author wangyaoyao
* @see <a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1">微信支付文档</a>
*
*/
public class WXPayParamsConstants {
public static final String APP_ID = "appid";
public static final String MCH_ID = "mch_id";
public static final String DEVICE_INFO = "device_info";
public static final String NONCE_STR = "nonce_str";
public static final String SIGN = "sign";
public static final String SIGN_TYPE = "sign_type";
public static final String BODY = "body";
public static final String DETAIL = "detail";
public static final String ATTACH = "attach";
public static final String OUT_TRADE_NO = "out_trade_no";
public static final String FEE_TYPE = "fee_type";
public static final String TOTAL_FEE = "total_fee";
public static final String SPBILL_CREATE_IP = "spbill_create_ip";
public static final String TIME_START = "time_start";
public static final String TIME_EXPIRE = "time_expire";
public static final String GOODS_TAG = "goods_tag";
public static final String NOTIFY_URL = "notify_url";
public static final String TRADE_TYPE = "trade_type";
public static final String PRODUCT_ID = "product_id";
public static final String LIMIT_PAY = "limit_pay";
public static final String OPENID = "openid";
public static final String RECEIPT = "receipt";
public static final String SCENE_INFO = "scene_info";
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, IOException {
final String nr = "\n\r";
StringBuffer sb = new StringBuffer();
sb.append("package com.wscrys.test;" + nr);
sb.append("\n");
sb.append("import static com.wscrys.pay.wx.support.WXPayParamsConstants.*;" + nr);
sb.append("import java.util.HashMap;\r\n");
sb.append("\n");
sb.append("/** \r\n");
sb.append("* 自动根据常量生成方法 \r\n");
sb.append("* @author " + System.getProperty("user.name") + "\r\n");
sb.append("* \r\n");
sb.append("**/ \r\n");
sb.append("public class WXPayParams extends HashMap<String, Object>{ " + nr);
Field[] fields = WXPayParamsConstants.class.getFields();
WXPayParamsConstants.class.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
if(StringUtils.isBlank(fieldName))
continue;
String value = String.valueOf(field.get(null)), fieldChangeName = createMethodName(value);
String methodName = fieldChangeName.substring(0,1).toUpperCase().concat(fieldChangeName.substring(1, fieldChangeName.length()));
sb.append(" public WXPayParams put" + methodName + "(String " +fieldChangeName + ") { \r\n");
sb.append(" return commonPut(" + fieldName + ", " + fieldChangeName + "); \r\n");
sb.append(" } \n \r");
}
sb.append(" private WXPayParams commonPut(String k, Object v) { \r" );
sb.append(" this.put(k, v); \r");
sb.append(" return this;\r");
sb.append(" }" + nr);
sb.append("}");
FileOutputStream stream = new FileOutputStream(new File("/Users/wangyaoyao/eclipse-workspace/pay/src/test/java/com/wscrys/test/WXPayParams.java"));
stream.write(sb.toString().getBytes());
stream.close();
}
private static final String separator = "_";
public static String createMethodName(String field) {
int hasSep = hasLen(field);
if(hasSep > 0) {
int separatorIndex = field.indexOf(separator);
String tempStr = field.replaceFirst(separator, "");
field = tempStr.substring(0, separatorIndex)
.concat(tempStr.substring(separatorIndex++, separatorIndex).toUpperCase())
.concat(tempStr.substring(separatorIndex, tempStr.length()).toLowerCase());
return createMethodName(field);
}
return field;
}
public static int hasLen(String str) {
if(StringUtils.isBlank(str))
return 0;
return str.length() - str.replaceAll(separator, "").length();
}
}