我正在尝试执行以下操作:
编写一个接收 Class 类型的对象作为参数的 JET 模板。该对象应该代表一个 Java 接口。模板生成一个实现接口的类,即为它定义的所有方法签名提供方法。生成的类的名称应该是 XImplementation,其中 X 是参数接口的名称。生成的类中的方法什么都不做或只返回常量值:0 表示 int 和 double,false 表示布尔值,null 表示引用类型。您不需要考虑任何其他返回类型。例如,对于以下接口 A,将生成类 AImplementation:
interface A { void m1(int x, int y); int m2(Object a); Object m3(); } class AImplementation implements A { public void m1(int p1, int p2) { } public int m2(Object p1) { return 0; } public Object m3() { return null; } }
提示:可以通过在对应的 Class 对象上使用 getSimpleName() 方法来获取类型的非限定(简单)名称。
我已阅读在 eclipse.org 上找到的有关 JET 的教程,但我仍然无法理解我需要做什么。
当我制作要翻译的 .txtjet 文件时,我是否试图让 .txtjet 文件的实现用我想在generate
方法中生成的代码写入一个巨大的字符串?这是正确的概念吗?
如果是这种情况,我在某个特定方面遇到了麻烦。这是我到目前为止提出的 JET 模板:
<%@ jet imports="java.lang.reflect.*" class="Q2Generator" %>
<%Object o = (Object) argument;%>
<%Class c = o.getClass();%>
public class <%=c.getName()%>Implementation implements <%=c.getName()%> {
<%for (Method m : c.getDeclaredMethods()) {%>
<% Class type = m.getReturnType();%>
<% if (!type.isPrimitive()) {%>
public <%=type.getSimpleName()%> <%=m.getName()%> { return null; } // this line is the problem
<% }%>
<%}%>
}
此模板在generate
方法中产生以下代码:
public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
protected final String TEXT_1 = NL + "public class ";
protected final String TEXT_2 = "Implementation implements ";
protected final String TEXT_3 = " {";
protected final String TEXT_4 = NL + "public ";
protected final String TEXT_5 = " ";
protected final String TEXT_6 = " { return null; }";
protected final String TEXT_7 = NL + "\t\t" + NL + "}";
protected final String TEXT_8 = NL;
public String generate(Object argument)
{
final StringBuffer stringBuffer = new StringBuffer();
Object o = (Object) argument;
Class c = o.getClass();
stringBuffer.append(TEXT_1);
stringBuffer.append(c.getName());
stringBuffer.append(TEXT_2);
stringBuffer.append(c.getName());
stringBuffer.append(TEXT_3);
for (Method m : c.getDeclaredMethods()) {
Class type = m.getReturnType();
if (!type.isPrimitive()) {
stringBuffer.append(TEXT_4);
stringBuffer.append(type.getSimpleName());
stringBuffer.append(TEXT_5);
stringBuffer.append(m.getName());
stringBuffer.append(TEXT_6);
}
}
stringBuffer.append(TEXT_7);
stringBuffer.append(TEXT_8);
return stringBuffer.toString();
}
有没有办法缩进stringBuffer.append()
if 语句中的行?字符串方式是完成这项任务的正确方式吗?
谢谢。