新聞中心
如何使用Freemarker生成java代碼
Freemarker是一個(gè)模板框架。我們可以通過Freemarker進(jìn)行代碼生成或頁面的靜態(tài)生成。 現(xiàn)在簡單的說一下怎樣使用Freemarker Freemarker的主要生成類
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)睢陽免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
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()){
//如何代碼已存在不重復(fù)生成
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 是模板所需要的數(shù)據(jù),我們可以通過面向?qū)ο竦姆椒ò褦?shù)據(jù)存在模板中public boolean genDaoInterface(String fileName){
DaoModel daoModel=new DaoModel();
//設(shè)置Dao實(shí)現(xiàn)類的包名
daoModel.setPackageName(DaoConstant.PACKAGE);
//取得接口名
String className=StringUtils.substringBefore(fileName,".");
//設(shè)置接口名
daoModel.setClassName(className);
MapString, Object data = new HashMapString, Object();
data.put("model", daoModel);
//設(shè)置生成的位置
String filePath=new String("src/"+package2path(DaoConstant.PACKAGE)+"/"+fileName);
//代碼生成
return super.generate(DaoConstant.INTERFACE_TEMPLATE, data, filePath);
}
data.put("model", daoModel);由這句代碼可看出我們將可以在模板中直接調(diào)用這些數(shù)據(jù)package ${model.packageName};
public interface ${model.className} extends BaseHibernateDao {
}
Java進(jìn)階之 怎么自動(dòng)生成代碼
myeclipse沒有直接的快捷鍵自動(dòng)生成構(gòu)造方法,可以有快捷鍵彈出source,接著點(diǎn)擊自動(dòng)生成構(gòu)造方法的菜單。
具體操作如下:工具里快捷鍵alt+shift+s
就彈出來Generate
Constructor
using
Fields
用java如何用代碼實(shí)現(xiàn)動(dòng)態(tài)生成JLabel
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個(gè)一排 間隔80 第一個(gè)x從40開始
int y=i/4*40+40;
lbl[i].setBounds(x, y, 80, 20);
panel.add(chb[i]);
}
Java動(dòng)態(tài)生成代碼
可以的,我說說大概思路,很簡單,你自己具體實(shí)現(xiàn)吧,把代碼寫給你沒意義的:
1.將你這段字符串輸出到一個(gè)文件里,用Java類文件的方式命名。
2.調(diào)用外部javac命令將該文件編譯。
3.用類加載器(ClassLoad)動(dòng)態(tài)加載新的class文件并用Class.forName()注冊該類,然后就可以正常使用了。
上面的每一步都能在baidu中找到實(shí)現(xiàn)方法,自己發(fā)揮吧。
怎么用java代碼來生成一個(gè)類,比如說我現(xiàn)在有一個(gè)接口IA,怎么用代碼來生成一個(gè)文件A.java,類A實(shí)現(xiàn)這個(gè)IA
正則表達(dá)式分析文件就可以了……
再加個(gè)狀態(tài)機(jī)就好…
當(dāng)然在處理代碼字符串之前,先要把所有的注釋部分刪除掉,包括//和/* */部分
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;
}
java代碼生成器能生成c語言代碼嗎?用什么方法能實(shí)現(xiàn)呢?
按照我的理解,可以的,代碼生成器是跨平臺(tái),而且是跨語言的(至少是跨文本語言的,UML暫時(shí)不好說,)。
代碼生成器作為一種開發(fā)工具,一般不直接作為程序的一部分,通常也不直接或間接(如通過AOP)被程序調(diào)用,他是通過編程的方式生成所需要的代碼,然后將生成的代碼作為源文件,復(fù)制到開發(fā)工具的代碼區(qū),然后進(jìn)行編譯。由于代碼生成器是在編譯之前運(yùn)行的,因此它可以跨語言,你不但可以用代碼生成器生成高級語言,也可以生成匯編語言,甚至機(jī)器碼(0、1代碼)。
但編寫代碼生成器是一個(gè)難點(diǎn),它需要你了解目標(biāo)編程語言的語法。如果別人已經(jīng)把你需要的代碼生成器寫好了,你只需按要求使用即可,此時(shí)就不需要了解目標(biāo)編程語言的語法。
JNI是通過Java調(diào)用C語言(或其他語言,一般是C),它的實(shí)現(xiàn)機(jī)制與代碼生成器不同(JNI是通過代碼調(diào)用實(shí)現(xiàn)功能,而代碼生成器是生成代碼,復(fù)制代碼進(jìn)行使用),由于C是底層語言,一些底層操作單靠Java無法實(shí)現(xiàn),所以才需要JNI。
以上是我對代碼生成器的個(gè)人理解,雖然提問時(shí)間已過了很久,但依然希望能對你及其他網(wǎng)友有所幫助。
新聞標(biāo)題:JAVA代碼生成如何實(shí)現(xiàn) Java代碼生成工具
文章網(wǎng)址:http://fisionsoft.com.cn/article/dodgced.html