标签: sun-codemodel

Java中代码生成器的更好方法?

我有一个里面有图表的课程.我迭代图形并创建一个构建图形的字符串,然后我将该字符串写入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)

java code-generation eclipse-jdt sun-codemodel

9
推荐指数
1
解决办法
1879
查看次数

CodeOutline/JClass/CClass在CodeModel中的作用是什么?

我的问题涉及编写JAXB插件,特别是JAXB代码模型.

ClassOutline(及其同伴)和JClass(和同伴)和CClass(和同伴)的角色是什么?在查看相应包中的类列表时,不清楚什么是鸡,什么是鸡蛋.

我的解释是CClass(CPropertyInfo,CEnumConstant...)是由XJC在XSD的初稿解析时创建的.然后,一些神奇的发生,这种模型转化为JClass(JFieldVar,JEnumConstant,...),这转变过程中的自定义应用.然后调用插件.ClassOutline用作这两个模型之间的桥梁.总之看起来非常复杂.

通过这些并行模型,我相信可以通过多种方式获得相同的信息.例如,类字段类型:

  • JClass#fields()→交通JFieldVar#type→交通JType
  • CClassInfo#getProperties()→交通CPropertyInfo#baseType→交通JType

我正在寻找上述模型生命周期的详细解释.谢谢.

jaxb xjc sun-codemodel jcodemodel

8
推荐指数
1
解决办法
1355
查看次数

Sun CodeModel通用方法

有谁知道使用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)

显然,由于演员阵容,这有点混乱.

java generics sun-codemodel

7
推荐指数
1
解决办法
3235
查看次数

在com.sun.codemodel中使用泛型

使用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.

java code-generation sun-codemodel

3
推荐指数
1
解决办法
2710
查看次数

如何创建<?使用JCodeModel扩展子类型>?

我在JCodeModel上使用了JClass.narrow来为类型创建必要的泛型,但我无法弄清楚如何生成这样的东西.

private Class<? extends Serializable> dataType;
Run Code Online (Sandbox Code Playgroud)

如何生成?延伸部分?

欢迎任何帮助.

java generics sun-codemodel

3
推荐指数
1
解决办法
1485
查看次数

Java Codemodel - 注释方法或类

我正在使用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 sun-codemodel

3
推荐指数
1
解决办法
2183
查看次数

如何使用Sun/Oracle CodeModel库键入强制转换?

我正在尝试使用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)

java code-generation sun-codemodel

2
推荐指数
1
解决办法
1601
查看次数

如何使用sun-codemodel生成匿名类?

我正在尝试使用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)

java sun-codemodel

2
推荐指数
1
解决办法
616
查看次数

使用CodeModel Java API覆盖注释

我如何@Override使用codeModel为我的方法添加注释?

JMethod update = classe.method(JMod.PUBLIC, void.class,"update");
update.annotate(?); 
Run Code Online (Sandbox Code Playgroud)

我没有找到@Override班级.

java code-generation sun-codemodel

1
推荐指数
1
解决办法
441
查看次数