首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在我的xjc插件代码中引用xjc生成的ObjectFactory类?

如何在我的xjc插件代码中引用xjc生成的ObjectFactory类?
EN

Stack Overflow用户
提问于 2017-04-07 18:24:11
回答 2查看 295关注 0票数 0

理想情况下,我希望向ObjectFactory类中添加一些生成的代码。如果这是不可能的,我想在另一个生成的方法中使用生成的ObjectFactory作为参数。

此场景如下所示:

代码语言:javascript
复制
import com.sun.tools.xjc.Plugin;
import com.sun.tools.xjc.outline.Outline;
import com.sun.tools.xjc.outline.ClassOutline;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;

public class App extends Plugin {
    ...
    private static void generateMyMethod(Outline model, ClassOutline classOutline) {
        //somehow get 'objectFactoryInstance'
        JMethod method = classOutline.implClass.method(JMod.PUBLIC | JMod.FINAL | JMod.STATIC, Void.class, "useObjectFactory")
                .param(objectFactoryInstance, "input"));
    }
}

生成的代码应该如下所示:

代码语言:javascript
复制
public final static void useObjectFactory(ObjectFactory input) {
    //stuff happens here
}

问题是如何从XJC插件中到达生成的ObjectFactory?

其他生成的类可以像这样访问,但ObjectFactory除外:

代码语言:javascript
复制
@Override
public boolean run(Outline model, Options opt, ErrorHandler errorHandler) throws SAXException {
    for (ClassOutline classOutline : model.getClasses()) {
        //do something with the generated class
    }
}
EN

回答 2

Stack Overflow用户

发布于 2017-07-26 11:39:34

我无法像访问其他生成的类那样访问生成的ObjectFactory类。所以现在我正在生成代码,这些代码假定将生成ObjectFactory。基于这个假设,我用我想要的方法创建了另一个类。

代码语言:javascript
复制
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JVar;
import com.sun.tools.xjc.outline.ClassOutline;

//...
    public void generateMethodThatUsesObjectFactory(ClassOutline classOutline) {
        JMethod method = classOutline.implClass.method(JMod.PUBLIC | 
        JMod.FINAL, model.getModel().codeModel.VOID, "useObjectFactory");
        JVar objectFactory = method.param(model.getModel().codeModel.ref(Object.class), "input");
        JExpression objectFactoryCast = JExpr.cast(model.getModel().codeModel.ref("ObjectFactory"), objectFactory);
        JBlock body = method.body();
        //add the objectFactory and objectFactoryCast to the method body
        //...
    }
//...

生成的结果类似于以下代码:

代码语言:javascript
复制
public final static void useObjectFactory(Object input) {
    JAXBElement<SomeType> je = ((ObjectFactory) input).callMethodOfObjectFactory();
    //...
}

我不认为这是一个理想的方法,但它是有效的。希望将来有一个更好的答案,我不会接受我自己的答案。

票数 0
EN

Stack Overflow用户

发布于 2020-06-04 12:36:32

您不对类进行迭代,而是对包进行迭代,并通过objectFactory()访问工厂。

代码语言:javascript
复制
@Override
public boolean run(Outline model, Options opt, ErrorHandler errorHandler) throws SAXException {
    for (PackageOutline packageOutline : model.getAllPackageContexts()) {
        JDefinedClass factory = packageOutline.objectFactory();
        //factory may be null for empty packages
    }
}

顺便说一句,在xjc处理xml/json/等等时,每个ObjectFactory都是“动态地”创建的。您需要手动调整对象工厂,以防在一些生成的JDefinedClass类中手动更改了类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43284794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档