Use CodeMoel Generate Java Source Code

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值