android自动创建生成model或者po文件

在开发过程中发现model或者po层的数据只是参数不同,其他都是一样,而每次编写的时候同样的事情需要花费很多的时间去写或者拷贝。虽然有些能够快速生成,但是还是需要时间,比如Parcelable接口实现的时候需要写一些东西,现在使用一个对文件编写的类来自动生成文件相信能减少更多的时间。甚至如果开发的接口够规范的话还能直接解析接口生成model或者po文件。


源码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.util.Date;

/**
 * 在指定位置生成model或者po文件
 * @author xiaoyi
 *
 * 2015年3月6日
 */
public class CreateMode {

	/**
	 * 在指定位置判断并创建文件和文件夹
	 * 
	 * @param dirPath
	 * @param fileName
	 * @return
	 * @throws Exception
	 */
	public static void createFile(String dirPath, String fileName)
			throws Exception {
		try {
			File dir = new File(dirPath);
			File file = new File(dir, fileName);
			// 在指定位置判断并创建文件夹
			if (dir.exists()) {
				System.out.println("model文件夹存在");

			} else {
				System.out.println("model文件夹不存在,创建model");
				dir.mkdir();// 不存在则创建
			}
			// 在指定位置判断并创建文件
			if (file.exists()) {
				System.out.println(fileName + "文件存在");
			} else {
				System.out.println(fileName + "文件不存在,新建" + fileName);
				file.createNewFile();// 不存在则创建
			}
		} catch (Exception e) {
			System.out.println(fileName + "文件创建失败!");
			e.printStackTrace();
		}
	}

	/**
	 * 对指定文件中写入指定内容
	 * 
	 * @param content
	 *            写入内容
	 * @param fileName
	 *            文件名称
	 * @param byteType
	 *            写入格式 GBK,UTF-8...
	 * @return
	 * @throws Exception
	 */
	public static boolean writeTxtFile(StringBuilder content, File fileName,
			String byteType) throws Exception {
		RandomAccessFile mm = null;
		boolean flag = false;
		FileOutputStream o = null;
		try {
			o = new FileOutputStream(fileName);
			o.write(content.toString().getBytes(byteType));
			o.close();
			flag = true;
		} catch (Exception e) {
			System.out.println("文件内容写入失败!");
			e.printStackTrace();
		} finally {
			if (mm != null) {
				mm.close();
			}
		}
		return flag;
	}

	/**
	 * 创建需要写入的内容
	 * 
	 * @param packageName
	 *            项目包名 比如:com.xy.pocket_book.po
	 * @param remark
	 *            对该po的说明备注
	 * @param author
	 *            作者
	 * @param time
	 *            创建时间
	 * @param otherInfo
	 *            其他说明
	 * @param className
	 *            类名
	 * @param impI
	 *            需要实现的接口 Parcelable or Serializable
	 * @param variable
	 *            成员变量
	 * @return
	 */
	private static StringBuilder createContant(String packageName,
			String remark, String author, String time, String otherInfo,
			String className, String impI, String... variable) {
		StringBuilder builder = new StringBuilder();
		// +项目包路径
		builder.append("package ").append(packageName).append(";\n\r\n\r");
		// +引用包
		builder.append("import android.os.Parcel;\n\r").append(
				"import android.os.Parcelable;\n\r\n\r");

		// +po注释 作者 日期等
		builder.append("/**\n\r").append(" * ").append(remark).append("\n\r");
		builder.append(" * ").append("\n\r");
		builder.append(" * ").append("@author ").append(author).append("\n");
		builder.append(" * ").append("\n\r");
		builder.append(" * ").append(time).append("\n\r");
		builder.append(" * ").append("\n\r");
		builder.append(" * ").append(otherInfo).append("\n\r");
		builder.append(" * ").append("\n\r");
		builder.append(" */ ").append("\n\r");

		// +类名称 接口
		builder.append("public class ").append(className)
				.append(" implements ").append(impI).append(" {\n\r");
		// +变量
		for (int i = 0; i < variable.length; i++) {
			builder.append("\tprivate String ").append(variable[i])
					.append(";\n");
		}
		builder.append("\n\r\n\r");
		// +空构造
		builder.append("\tpublic ").append(className).append("() {}\n\r\n\r");
		// +参数构造
		builder.append("\tpublic ").append(className).append("(");
		for (int i = 0; i < variable.length; i++) {
			if (i == variable.length - 1) {
				builder.append("String ").append(variable[i]);
			} else {
				builder.append("String ").append(variable[i]).append(",");
			}
		}
		builder.append(") {\n\r");
		builder.append("\t\tsuper();\n");
		for (int i = 0; i < variable.length; i++) {
			builder.append("\t\tthis.").append(variable[i]).append(" = ")
					.append(variable[i]).append(";\n");
		}
		builder.append("\t}\n\r\n\r");

		// +toString
		builder.append("\t@Override\n");
		builder.append("\tpublic String toString() {\n");
		builder.append("\t\treturn \"").append(className).append(" [");
		for (int i = 0; i < variable.length; i++) {
			if (i == variable.length - 1) {
				// name=" + name + "
				builder.append(variable[i]).append("=\" + ")
						.append(variable[i]).append(" + \"");

			} else if (i == 0) {
				// name=" + name + ",
				builder.append(variable[i]).append("=\" + ")
						.append(variable[i]).append(" + \",");
			} else {
				builder.append(" ").append(variable[i]).append("=\" + ")
						.append(variable[i]).append(" + \",");
			}
		}
		builder.append("]\";\n");
		builder.append("\t}\n\r\n\r");

		// +get
		for (int i = 0; i < variable.length; i++) {
			String str1 = variable[i].substring(0, 1);
			String str2 = variable[i].substring(1, variable[i].length());
			builder.append("\tpublic String get").append(str1.toUpperCase()).append(str2).append("() {\n");
			builder.append("\t\treturn ").append(variable[i]).append(";\n");
			builder.append("\t}\n\r");
		}

		// +set
		for (int i = 0; i < variable.length; i++) {
			String str1 = variable[i].substring(0, 1);
			String str2 = variable[i].substring(1, variable[i].length());
			builder.append("\tpublic void set").append(str1.toUpperCase()).append(str2).append("(String ").append(variable[i]).append(") {\n");
			builder.append("\t\tthis.").append(variable[i]).append(" = ").append(variable[i]).append(";\n");
			builder.append("\t}\n\r");
		}
		// 如果使用Parcelable接口 添加两个方法一个实现
		if(impI.equals("Parcelable")){
			// 第一个方法
			builder.append("\t@Override\n");
			builder.append("\tpublic int describeContents() {\n");
			builder.append("\t\treturn 0;\n");
			builder.append("\t}\n\r");
			
			// 第二个方法
			builder.append("\t@Override\n");
			builder.append("\tpublic void writeToParcel(Parcel dest, int flags) {\n");
			for (int i = 0; i < variable.length; i++) {
				builder.append("\t\tdest.writeString(").append(variable[i])
				.append(");\n");
			}
			builder.append("\t}\n\r");
			
			// 第三个实现
			builder.append("\tprivate static final Parcelable.Creator<")
			.append(className).append("> CREATOR = new Creator<")
			.append(className).append(">() {\n\r");
			builder.append("\t\t@Override\n");
			builder.append("\t\tpublic ").append(className)
			.append("[] newArray(int size) {\n");
			builder.append("\t\t\treturn new ").append(className)
			.append("[size];\n");
			builder.append("\t\t}\n\r");
			
			builder.append("\t\t@Override\n");
			builder.append("\t\tpublic ").append(className)
			.append(" createFromParcel(Parcel source) {\n");
			builder.append("\t\t\t").append(className).append(" mSource = new ")
			.append(className).append("();\n");
			for (int i = 0; i < variable.length; i++) {
				builder.append("\t\t\tmSource.").append(variable[i])
				.append(" = source.readString();\n");
			}
			builder.append("\t\t\treturn mSource;\n");
			builder.append("\t\t}\t\n");
			builder.append("\t};\n\r");
			builder.append("};");
			
		}

		return builder;

	}

	public static void main(String[] args) {
		// 换行符/n /r /t
		// StringBuilder builder = new StringBuilder(19);
		// builder.append("621363") .append("1")
		// 1.创建文件
		try {
			createFile("C:\\Users\\chengxuyuan2\\Desktop\\model", "aa.java");
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 2.创建写入内容
		StringBuilder builder = createContant("com.xy.pocket_book.po", "测试备注",
				"xiaoyi", new Date().toLocaleString(), "其他信息备注", "BillPo",
				"Parcelable", "id", "title", "parent_id", "remark");

		// 3.写入内容
		File f = new File("C:\\Users\\chengxuyuan2\\Desktop\\model\\aa.java");
		try {
			writeTxtFile(builder, f, "GBK");
			System.out.println("文件写入成功!");
		} catch (Exception e) {
			System.out.println("文件写入失败!");
			e.printStackTrace();
		}
	}

}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。