package samples;
// Example: CodeFactory.java
import java.io.File;
import org.apache.log4j.Logger;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JDocComment;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JPackage;
import com.sun.codemodel.JType;
import com.sun.codemodel.JVar;
/** * * @author naman */
public class CodeFactory {
private Logger logger = Logger.getLogger(CodeFactory.class);
// Method to get JType based on any String Value
public JType getTypeDetailsForCodeModel(JCodeModel jCodeModel, String type) {
if (type.equals("Unsigned32")) {
return jCodeModel.LONG;
} else if (type.equals("Unsigned64")) {
return jCodeModel.LONG;
} else if (type.equals("Integer32")) {
return jCodeModel.INT;
} else if (type.equals("Integer64")) {
return jCodeModel.LONG;
} else if (type.equals("Enumerated")) {
return jCodeModel.INT;
} else if (type.equals("Float32")) {
return jCodeModel.FLOAT;
} else if (type.equals("Float64")) {
return jCodeModel.DOUBLE;
} else {
return null;
}
}
// Function to generate CodeModel Class
public void writeCodeModel(String factroyPackage) {
try {
/* Creating java code model classes */
JCodeModel jCodeModel = new JCodeModel();
/* Adding packages here */
JPackage jp = jCodeModel._package(factroyPackage);
/* Giving Class Name to Generate */
JDefinedClass jc = jp._class("GeneratedFactory");
/* Adding annotation for the Class */
// jc.annotate(com.myannotation.AnyXYZ.class);
/* Adding class level coment */
JDocComment jDocComment = jc.javadoc();
jDocComment.add("Class Level Java Docs");
/*
* Adding method to the Class which is public static and returns
* com.somclass.AnyXYZ.class
*/
String mehtodName = "myFirstMehtod";
JMethod jmCreate =
jc.method(JMod.PUBLIC | JMod.STATIC,Integer.class,"create" + mehtodName);
/* Addign java doc for method */
jmCreate.javadoc().add("Method Level Java Docs");
/* Adding method body */
JBlock jBlock = jmCreate.body();
/* Defining method parameter */
JType jt = getTypeDetailsForCodeModel(jCodeModel,"Unsigned32");
if (jt != null) {
jmCreate.param(jt,"data");
} else {
jmCreate.param(java.lang.String.class,"data");
}
/* Defining some class Variable in mthod body */
JClass jClassavpImpl = jCodeModel.ref("org.isunday.tools.CodeGenerator");// .ref(Integer.class);
JVar jvarAvpImpl = jBlock.decl(jClassavpImpl,"varName");
jvarAvpImpl.init(JExpr._new(jClassavpImpl));
/* Adding some direct statement */
jBlock.directStatement("varName.setCode(100);");
/* returning varibalbe */
jBlock._return(jvarAvpImpl);
/* Building class at given location */
File file = new File("./target/classes");
file.mkdirs();
jCodeModel.build(file);
} catch (Exception ex) {
logger.debug("Other Exception which in not catched:" + ex);
ex.printStackTrace();
}
}
public static void main(String[] agrs) {
new CodeFactory().writeCodeModel("aito.java");
}
}
生成文件内容:
Generated Class: GeneratedFactory.java
package com.test;
import com.myannotation.AnyXYZ;
import com.somclass.AnyXYZ;
/**
* Class Level Java Docs
*
*/
@com.myannotation.AnyXYZ
public class GeneratedFactory {
/**
* Method Level Java Docs
*
*/
public static com.somclass.AnyXYZ myFirstMehtod(long data) {
com.somclass.AnyXYZ varName = new com.somclass.AnyXYZ();
varName.setCode(100);
return varName;
}
}
参考资料:
http://namanmehta.blogspot.tw/2010/01/use-codemodel-to-generate-java-source.html