序:
特点:基本上能够满足简单JavaBean的生成,可以通过配置文件的更改,灵活自动生成对应的bean。
缺点:
1.这里只是作为一个简单的例子,在实际应用当中仍需要更改具体的代码,以应对不同名称,不同包名的类,总言之就是配置方面还不够灵活。
2.对于配置资源文件的对应参数,虽然很方便,但并没有对其参数进行严格的格式指定,即没有对应的正则表达式对其获取的参数进行校验。因此使用时需较为注意。
正文:
下面直接切入正题:
前提是引入:freemark-xxxx.jar包
/*
Modification Log:
-----------------------------------------------------------------------------------
Version Notes By Date
------- -------------------------- ---------------------------------------
1.0 Create Techbirds 2012-12-13
-----------------------------------------------------------------------------------
*/
package main.classinfo;
/**
* 封装属性信息
*
*/
public class Attribute {
private String name;
private String type;
public Attribute() {
}
public Attribute(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
/*
Modification Log:
-----------------------------------------------------------------------------------
Version Notes By Date
------- -------------------------- ---------------------------------------
1.0 Create Techbirds 2012-12-13
-----------------------------------------------------------------------------------
*/
package main.classinfo;
/**
* 封装类信息
*
*/
public class Class {
private String packagename;
private String classname;
private String[] imports;
public Class() {
}
public Class(String classname, String[] imports,String packagename) {
super();
this.classname = classname;
this.imports = imports;
this.packagename=packagename;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String[] getImports() {
return imports;
}
public void setImports(String[] imports) {
this.imports = imports;
}
public String getPackagename() {
return packagename;
}
public void setPackagename(String packagename) {
this.packagename = packagename;
}
}
public class BeanByCreateMain {
private final static String TEMPLATE_NAME="template.ftl";
private Configuration cfg;
private Properties ploader;
/**
* 初始化工作
*/
public void init() throws Exception {
// 负责管理的实例创建+设置模板文件所在的目录
cfg = new Configuration();
// load资源的实例创建
ploader = new Properties();
cfg.setDirectoryForTemplateLoading(new File(
"E:\\Workspaces\\workspace\\javabean_complier\\bean_template"));
ploader.load(new FileInputStream(
"E:\\Workspaces\\workspace\\javabean_complier\\src\\bean.properties"));
}
public void process() throws IOException, TemplateException {
//1.load信息
Class clazz=loadClass();
List<Attribute> attributes=loadAttr();
//2.向root中放入模版中所需信息
Map<String, Object> root = new HashMap<String, Object>();
root.put("clazz",clazz);
root.put("attributes",attributes);
//3.将模版进行指定文件的输出
write(root);
}
/*
* 执行入口
*/
public static void main(String[] args) throws Exception {
BeanByCreateMain hfm = new BeanByCreateMain();
hfm.init();
hfm.process();
}
/*
* 加载类信息:包名,类名,import
*/
public Class loadClass() {
String packagename=ploader.getProperty("packagename");
String classname=ploader.getProperty("classname");
String values=ploader.getProperty("imports");
String[] imports=values.split(",");
Class clazz = new Class(classname, imports, packagename);
return clazz;
}
/*
* 加载属性:属性名,属性类型
*/
public List<Attribute> loadAttr() {
List<Attribute> attributes = new ArrayList<Attribute>();
String values=ploader.getProperty("attribute");
String[] strs=values.split(",");
for (String s : strs) {
String[] sp=s.split(":");
attributes.add(new Attribute(sp[0],sp[1]));
}
return attributes;
}
/*
* 将模版进行指定文件的输出
*/
public void write(Map<String, Object> root) throws IOException, TemplateException{
Template t = cfg.getTemplate(TEMPLATE_NAME);
OutputStream out = new FileOutputStream(
new File("E:\\Workspaces\\workspace\\javabean_complier\\src\\bean\\User.java"));
t.process(root, new OutputStreamWriter(out));
}
}
bean.properties资源文件
packagename=bean
classname=User
imports=java.util.ArrayList,java.util.List
attribute=name:String,age:int
template.ftl模版文件:
package ${clazz.packagename};
<#list clazz.imports as being>
import ${being};
</#list>
public class ${clazz.classname} {
<#list attributes as being>
private ${being.type} ${being.name};
public ${being.type} get${being.name?cap_first}() {
return ${being.name};
}
public void set${being.name?cap_first}(${being.type} ${being.name}) {
this.${being.name} = ${being.name};
}
</#list>
执行结果:
package bean;
import java.util.ArrayList;
import java.util.List;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}