大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Freemarker是一个模板框架。我们可以通过Freemarker进行代码生成或页面的静态生成。 现在简单的说一下怎样使用Freemarker Freemarker的主要生成类
专注于为中小企业提供成都做网站、成都网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业睢阳免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
public boolean generate(String templateFileName, Map data,
String fileName) {
try {
//取得模板的位置
String templateFileDir=templateFileName.substring(0, templateFileName.lastIndexOf("/"));
//取得模板的名字
String templateFile=templateFileName.substring(templateFileName.lastIndexOf("/"), templateFileName.length());
//取得生成文件的路径
String genFileDir=fileName.substring(0, fileName.lastIndexOf("/"));
Template template = ConfigurationHelper.getConfiguration(templateFileDir).getTemplate(templateFile);
File fileDir=new File(genFileDir);
org.apache.commons.io.FileUtils.forceMkdir(fileDir);
File output = new File(fileName);
if(output.exists()){
//如何代码已存在不重复生成
return false;
}
Writer writer = new FileWriter(output);
template.process(data, writer);
writer.close();
} catch (TemplateException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
代码中的Map 是模板所需要的数据,我们可以通过面向对像的方法把数据存在模板中public boolean genDaoInterface(String fileName){
DaoModel daoModel=new DaoModel();
//设置Dao实现类的包名
daoModel.setPackageName(DaoConstant.PACKAGE);
//取得接口名
String className=StringUtils.substringBefore(fileName,".");
//设置接口名
daoModel.setClassName(className);
MapString, Object data = new HashMapString, Object();
data.put("model", daoModel);
//设置生成的位置
String filePath=new String("src/"+package2path(DaoConstant.PACKAGE)+"/"+fileName);
//代码生成
return super.generate(DaoConstant.INTERFACE_TEMPLATE, data, filePath);
}
data.put("model", daoModel);由这句代码可看出我们将可以在模板中直接调用这些数据package ${model.packageName};
public interface ${model.className} extends BaseHibernateDao {
}
myeclipse没有直接的快捷键自动生成构造方法,可以有快捷键弹出source,接着点击自动生成构造方法的菜单。
具体操作如下:工具里快捷键alt+shift+s
就弹出来Generate
Constructor
using
Fields
String[] str={"名字1","名字2","名字3"};
for(int i=0;iv.length;i++){
JLabel lbl = new JLabel(str[i]);
int x=i%4*80+40; //4个一排 间隔80 第一个x从40开始
int y=i/4*40+40;
lbl[i].setBounds(x, y, 80, 20);
panel.add(chb[i]);
}
可以的,我说说大概思路,很简单,你自己具体实现吧,把代码写给你没意义的:
1.将你这段字符串输出到一个文件里,用Java类文件的方式命名。
2.调用外部javac命令将该文件编译。
3.用类加载器(ClassLoad)动态加载新的class文件并用Class.forName()注册该类,然后就可以正常使用了。
上面的每一步都能在baidu中找到实现方法,自己发挥吧。
正则表达式分析文件就可以了……
再加个状态机就好…
当然在处理代码字符串之前,先要把所有的注释部分删除掉,包括//和/* */部分
import java.util.regex.*;
public class InterfaceAnalyzer {
public static void main(String[] args) {
interface_context =
"package com.app.test;\n"
+"public interface IA {\n"
+" public abstract void a();\n"
+" public abstract void b();\n"
+"}";
interface_name = "";
class_name = "A";
class_implement = "public class "+class_name+" implements ";
pattern = Pattern.compile("[\\w_\\.]+");
match = pattern.matcher(interface_context);
while(match.find()) {
stateMachine(match.group());
}
class_implement += ") {\n\t}\n}";
System.out.println(class_implement);
}
public static void stateMachine(String word) {
switch(status) {
case 0:
if("package".equals(word)) {
status = 1;
} else if("interface".equals(word)) {
status = 2;
}
break;
case 1: // get package name
package_name = word;
class_implement += package_name+".";
status = 0;
break;
case 2: // get interface name
interface_name = word;
class_implement += interface_name + "{\n";
status = 3;
break;
case 3: // start a member
if("public".equals(word) || "private".equals(word) || "protected".equals(word)) {
member_access_type = word;
status = 4;
}
break;
case 4: // get a method that needs to override
if("abstract".equals(word)) {
status = 5;
class_implement += "\t" + member_access_type + " ";
} else {
status = 3; // not a method member
}
break;
case 5: // get member type
member_type = word;
class_implement += member_type + " ";
status = 6;
break;
case 6: // get member name
member_name = word;
class_implement += member_name + "(";
status = 7;
break;
case 7: // get parameter type
if("public".equals(word) || "private".equals(word) || "protected".equals(word)) {
member_access_type = word;
class_implement += ") {\n\t}\n";
status = 4;
} else {
para_type = word;
class_implement += ", " + para_type + " ";
status = 8;
}
break;
case 8: // get parameter name
para_name = word;
class_implement += para_name;
status = 8;
break;
}
}
private static int status;
private static String interface_context;
private static String package_name;
private static String interface_name;
private static String class_name;
private static String class_implement;
private static String member_name;
private static String member_type;
private static String member_access_type;
private static String para_name;
private static String para_type;
private static Pattern pattern;
private static Matcher match;
}
按照我的理解,可以的,代码生成器是跨平台,而且是跨语言的(至少是跨文本语言的,UML暂时不好说,)。
代码生成器作为一种开发工具,一般不直接作为程序的一部分,通常也不直接或间接(如通过AOP)被程序调用,他是通过编程的方式生成所需要的代码,然后将生成的代码作为源文件,复制到开发工具的代码区,然后进行编译。由于代码生成器是在编译之前运行的,因此它可以跨语言,你不但可以用代码生成器生成高级语言,也可以生成汇编语言,甚至机器码(0、1代码)。
但编写代码生成器是一个难点,它需要你了解目标编程语言的语法。如果别人已经把你需要的代码生成器写好了,你只需按要求使用即可,此时就不需要了解目标编程语言的语法。
JNI是通过Java调用C语言(或其他语言,一般是C),它的实现机制与代码生成器不同(JNI是通过代码调用实现功能,而代码生成器是生成代码,复制代码进行使用),由于C是底层语言,一些底层操作单靠Java无法实现,所以才需要JNI。
以上是我对代码生成器的个人理解,虽然提问时间已过了很久,但依然希望能对你及其他网友有所帮助。