动态生成javaBean,编译

 

 

package com.bean; import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * @version: Feb 25, 2010 4:03:07 PM * @desc: */ public class AutoJavaBean { private static Log log = LogFactory.getLog(AutoJavaBean.class); public static String className; // 要生产的javabean的类名 public static String packageName; // 要生产的javabean的包名 public ArrayList arraylist = new ArrayList(); // 属性容器 public PrintWriter pw; public StringBuffer sb = new StringBuffer(); /** * 定义javabean中的属性. 这个javabean生成器只是一个小工具,为让它尽量小巧就用了内部类 */ class Property { public String name; // 属性名字 public String type; // 属性类型 public void setName(String name) { this.name = name; } public String getName() { return name; } public void setType(String type) { this.type = type; } public String getType() { return type; } } /** * 从文件读取XML,输入文件名,返回XML文档 */ public Document read(String fileName) throws Exception { SAXReader reader = new SAXReader(); String path = ClassPathUtil.getClassPath(AutoJavaBean.class); Document document = reader.read(new File(path + "//" +fileName)); System.out.println("配置文件路径:" + path + "//" +fileName); return document; } /** * 解析XML文档. 得到类名包名. 把所有属性放入容器 */ public void parse(Document doc) { Element root = doc.getRootElement(); // 得到根节点 //System.out.println("根节点名称:" + root.getName()); packageName = root.attributeValue("name"); // 得到包名 System.out.println("包名:" + packageName); className = root.element("class").attributeValue("name"); // 得到类名 System.out.println("类名:" + className); // 枚举所有子节点,把所有属性放入容器 for (Iterator i = root.element("class").elementIterator(); i.hasNext();) { Element element = (Element) i.next(); Property pro = null; String name = null; String type = null; if (element.getQualifiedName().equals("parameter")) { name = element.attributeValue("name"); type = element.attributeValue("type"); System.out.println("属性名称:" + name + " 属性类型:" + type); // 设置属性类 pro = (new AutoJavaBean()).new Property(); pro.setName(name); pro.setType(type); // 向容器添加属性 arraylist.add(pro); } } } /** * 写出javabean的开始部分. package import class */ public void start() { if (packageName.length() != 0) { sb.append("package " + packageName + ";/n/n"); } sb.append("import java.io.Serializable;/n/n"); sb.append("public class " + className + " implements Serializable { /n"); } /** * 写javabean的属性部分 */ public void generateProperties() { ListIterator lit = arraylist.listIterator(); Property pro = null; while (lit.hasNext()) { pro = (Property) lit.next(); sb.append("/tprivate " + pro.getType() + " " + pro.getName() + ";/n"); } sb.append("/n"); } /** * 写每个属性的 set() and get() */ public void generateMethods() { ListIterator lit = arraylist.listIterator(); Property pro = null; String name = null; String type = null; while (lit.hasNext()) { pro = (Property) lit.next(); name = pro.getName(); type = pro.getType(); // set() sb.append("/tpublic void set" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length()) + "(" + type + " " + name + ") {/n"); sb.append("/t/tthis." + name + " = " + name + ";/n"); sb.append("/t}/n"); // get() 处理boolean类型 if(!"boolean".equals(type)) { sb.append("/tpublic " + type + " get" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length()) + "(){/n"); sb.append("/t/treturn " + name + ";/n"); sb.append("/t}/n"); } else { sb.append("/tpublic " + type + " is" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length()) + "(){/n"); sb.append("/t/treturn " + name + ";/n"); sb.append("/t}/n"); } } } /** * 添加结尾"}" */ public void end() { sb.append("}/n"); } /** * 把生产的所有内容输出到真正的文件中 */ public void makeFile() { try { String path = ClassPathUtil.getClassPath(AutoJavaBean.class); File file = new File(path + "//" + className + ".java"); pw = new PrintWriter(file); pw.print(sb.toString()); pw.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 删除classes下的javabean源文件 */ public static void delTempFile() { String path = ClassPathUtil.getClassPath(AutoJavaBean.class); File file = new File(path + "//" + className + ".java"); if(file.exists()) { file.delete(); } } /** * 把产生的javabean源文件输出到工作空间对应目录下 */ public void makeFileToSrc() { try { String path = ClassPathUtil.getClassPath(AutoJavaBean.class); path = path.substring(0, path.length()-16); int lastSlash = path.lastIndexOf("//"); path = path.substring(0, lastSlash) + "//src"; //src路径 packageName = packageName.replaceAll("//.", "////"); File file = new File(path + "//" + packageName); file.mkdirs(); //创建包目录 file = new File(path + "//" + packageName + "//" + className + ".java"); pw = new PrintWriter(file); pw.print(sb.toString()); pw.close(); } catch (Exception e) { e.printStackTrace(); } } public void execute() { try { parse(read("javabean.xml")); start(); generateProperties(); generateMethods(); end(); makeFileToSrc(); } catch (Exception e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { AutoJavaBean javaBean = new AutoJavaBean(); javaBean.execute(); try { Runtime rt = Runtime.getRuntime(); String command = "javac -d "; String path = ClassPathUtil.getClassPath(AutoJavaBean.class); String pathSrc = path.substring(0, path.length()-16); int lastSlash = pathSrc.lastIndexOf("//"); pathSrc = pathSrc.substring(0, lastSlash) + "//src"; //src目录地址路径 //完整源文件地址 pathSrc += "//" + packageName.replaceAll("//.", "////") + "//" + javaBean.className + ".java"; System.out.println("编译命令:" + command + path + " " + pathSrc); rt.exec(command + path + " " + pathSrc); rt.gc(); } catch (Exception e) { e.printStackTrace(); } } }

 

<?xml version="1.0" encoding="UTF-8"?> <package name="com.zest.test"> <class name="Human"> <parameter name="name" type="String"/> <parameter name="age" type="int"/> <parameter name="dead" type="boolean"/> </class> </package>


ClassPathUtil: 

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URL;

public class ClassPathUtil {

	/** 
	 * 
	 * Description:取得当前类所在的文件 
	 * 
	 * @param clazz 
	 * @return 
	 */
	public static File getClassFile(Class clazz) {
		URL path = clazz.getResource(clazz.getName().substring(
				clazz.getName().lastIndexOf(".") + 1)
				+ ".class");
		if (path == null) {
			String name = clazz.getName().replaceAll("[.]", "/");
			path = clazz.getResource("/" + name + ".class");
		}
		return new File(path.getFile());
	}

	/** 
	 * 
	 * Description:同getClassFile 解决中文编码问题 
	 * 
	 * @param clazz 
	 * @return 
	 */
	public static String getClassFilePath(Class clazz) {
		try {
			return java.net.URLDecoder.decode(getClassFile(clazz)
					.getAbsolutePath(), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return "";
		}
	}

	/** 
	 * 
	 * Description:取得当前类所在的ClassPath目录 
	 * 
	 * @param clazz 
	 * @return 
	 */
	public static File getClassPathFile(Class clazz) {
		File file = getClassFile(clazz);
		for (int i = 0, count = clazz.getName().split("[.]").length; i < count; i++)
			file = file.getParentFile();
		if (file.getName().toUpperCase().endsWith(".JAR!")) {
			file = file.getParentFile();
		}
		return file;
	}

	/** 
	 * 
	 * Description: 同getClassPathFile 解决中文编码问题 
	 * 
	 * @param clazz 
	 * @return 
	 */
	public static String getClassPath(Class clazz) {
		try {
			return java.net.URLDecoder.decode(getClassPathFile(clazz)
					.getAbsolutePath(), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return "";
		}
	}

}


你可能感兴趣的:(exception,String,File,command,Class,Path)