Java根据常量动态生成方法或文件

很多时候定义了一些常量,又想根据常量生成一些想要的方法,可以当作一些参考

工具类-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();
	}

}

猜你喜欢

转载自blog.csdn.net/qwa865595014/article/details/105550772