我有一个里面有图表的课程.我迭代图形并创建一个构建图形的字符串,然后我将该字符串写入Java文件.有没有更好的方法,我读到JDT和CodeModel,但我真的需要一些如何使用它的提示.
编辑
我正在做一个正则表达式代码生成器,到目前为止,我已将正则表达式转换为有向图中表示的DFA(使用grail库).当我有DFA时,下一步是生成一个有三个方法的类,第一个构建相同的图形(DFA),第二个方法从一个节点移动到另一个节点,第三个方法匹配输入字符串是否被接受.只有第一种方法根据regularrexpression输入而改变,另外两种方法是静态的,并且对于每个生成的java类都是相同的.
我基于字符串的方法如下:
import grail.interfaces.DirectedEdgeInterface;
import grail.interfaces.DirectedGraphInterface;
import grail.interfaces.DirectedNodeInterface;
import grail.interfaces.EdgeInterface;
import grail.iterators.EdgeIterator;
import grail.iterators.NodeIterator;
import grail.properties.GraphProperties;
import grail.setbased.SetBasedDirectedGraph;
public class ClassName {
private SetBasedDirectedGraph graph = new SetBasedDirectedGraph();
private static DirectedNodeInterface state;
private static DirectedNodeInterface currentState;
protected DirectedEdgeInterface edge;
public ClassName() {
buildGraph();
}
protected void buildGraph() {
// Creating Graph Nodes (Automaton States)
state = graph.createNode(3);
state.setProperty(GraphProperties.LABEL, "3");
state.setProperty(GraphProperties.DESCRIPTION, "null");
graph.addNode(state);
state = graph.createNode(2);
state.setProperty(GraphProperties.LABEL, "2");
state.setProperty(GraphProperties.DESCRIPTION, "null");
graph.addNode(state);
state = graph.createNode(1);
state.setProperty(GraphProperties.LABEL, "1");
state.setProperty(GraphProperties.DESCRIPTION, "Accepted");
graph.addNode(state); …Run Code Online (Sandbox Code Playgroud) 我的问题涉及编写JAXB插件,特别是JAXB代码模型.
ClassOutline(及其同伴)和JClass(和同伴)和CClass(和同伴)的角色是什么?在查看相应包中的类列表时,不清楚什么是鸡,什么是鸡蛋.
我的解释是CClass(CPropertyInfo,CEnumConstant...)是由XJC在XSD的初稿解析时创建的.然后,一些神奇的发生,这种模型转化为JClass(JFieldVar,JEnumConstant,...),这转变过程中的自定义应用.然后调用插件.ClassOutline用作这两个模型之间的桥梁.总之看起来非常复杂.
通过这些并行模型,我相信可以通过多种方式获得相同的信息.例如,类字段类型:
JClass#fields()→交通JFieldVar#type→交通JTypeCClassInfo#getProperties()→交通CPropertyInfo#baseType→交通JType我正在寻找上述模型生命周期的详细解释.谢谢.
有谁知道使用CodeModel生成以下泛型方法声明:
public <T> T getValue(Class<T> clazz){...}
Run Code Online (Sandbox Code Playgroud)
用法:
ValueType value = getValue(ValueType.class);
Run Code Online (Sandbox Code Playgroud)
似乎不是由现有的implmentation处理.
我知道我可以按如下方式处理代码,但它需要一个强制转换:
public Object getValue(Class class){...}
Run Code Online (Sandbox Code Playgroud)
用法:
ValueType value = (ValueType)getValue(ValueType.class);
Run Code Online (Sandbox Code Playgroud)
显然,由于演员阵容,这有点混乱.
使用com.sun.codemodel,我想生成一个通用的LinkedList字段.我可以使用以下代码创建一个原始字段:
JDefinedClass masterClass;
String detailName;
JDefinedClass detailClass;
JFieldVar detailField = masterClass.field(JMod.PRIVATE, LinkedList.class, detailName);
Run Code Online (Sandbox Code Playgroud)
但是我找不到用通用类型创建LinkedList的方法detailClass.
我在JCodeModel上使用了JClass.narrow来为类型创建必要的泛型,但我无法弄清楚如何生成这样的东西.
private Class<? extends Serializable> dataType;
Run Code Online (Sandbox Code Playgroud)
如何生成?延伸部分?
欢迎任何帮助.
我正在使用CodeModel以编程方式生成.java文件.这是创建方法的代码片段:
JCodeModel jCodeModel = new JCodeModel();
JDefinedClass definedClass = jCodeModel._class("Foo");
//To generate method
JMethod method = definedClass.method(3, String.class, "getCustomerInfo()");
Run Code Online (Sandbox Code Playgroud)
当我跑(假设所有其他必要的代码都在那里);
public String getCustomerInfo() { }
Run Code Online (Sandbox Code Playgroud)
但是我想要注释上面这样的方法:
@GET
@Path("/getCustomerInfo")
public String getCustomerInfo() { }
Run Code Online (Sandbox Code Playgroud)
我试过以下方法:
method.annotate(...) and method.annotate2(...)
但是这些方法只接受Class文件作为参数(比如SomeClass.class形式),但我希望能够将String作为参数,并且该类将在运行时动态可用.
说我应该能够这样做:method.annotate("Path").
谁能帮我?
我正在尝试使用Java CodeModel库来生成一些代码.在我生成的代码中,我需要执行类型转换.我想要这样的东西......
foo.setBar( ((TypeCastToThis)someVariable).getBar() );
Run Code Online (Sandbox Code Playgroud)
我在库中找到的唯一支持是使用JCast JExpr.cast(JType类型,JExpression expr).但是根据Eclipse,返回类型JCast不是公共的.确切的错误是:"类型com.sun.codemodel.JCast不可见".
这是我正在做的一个简单的例子.
import java.io.File;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCast; //<-- Eclipse flags this as an error
import com.sun.codemodel.JClass;
import com.sun.codemodel.JClassAlreadyExistsException;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JVar;
public class CastTest
{
public static void main(String[] args) throws JClassAlreadyExistsException
{
// TODO Auto-generated method stub
JCodeModel codeModel = new JCodeModel();
JDefinedClass testClass = codeModel._class("MyTestClass");
JMethod testMeth = testClass.method(JMod.PUBLIC, codeModel.VOID, "TypeCastTestMethod");
JBlock testMethBody = testMeth.body();
JVar castMeVar = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用codemodel生成下面的代码,但我不知道如何创建匿名类语法.我在codemodel文档中找不到它(https://codemodel.java.net/nonav/apidocs/index.html?com/sun/codemodel)
ContentProducer cp = new ContentProducer() {
public void writeTo(OutputStream outstream) {
try {
Writer writer = new OutputStreamWriter(outstream, "UTF-8");
writer.write("<product><descricao>Update de descricao</descricao></product>");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
};
Run Code Online (Sandbox Code Playgroud)
我可以使用下面的代码来实例化变量"ContentProducer",但我不知道如何在构造函数旁边实现writeTo方法.
JClass ContentProducer = events.ref(org.apache.http.entity.ContentProducer.class);
JVar contentProducer = tryBlock.body().decl(ContentProducer, "contentProducer").init(JExpr._new(ContentProducer));
Run Code Online (Sandbox Code Playgroud) 我如何@Override使用codeModel为我的方法添加注释?
JMethod update = classe.method(JMod.PUBLIC, void.class,"update");
update.annotate(?);
Run Code Online (Sandbox Code Playgroud)
我没有找到@Override班级.