繁体   English   中英

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

[英]How can I reference the ObjectFactory class generated by xjc from within my xjc plugin code?

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

这个场景看起来像这样:

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"));
    }
}

生成的代码应如下所示:

public final static void useObjectFactory(ObjectFactory input) {
    //stuff happens here
}

问题是如何从我的 XJC 插件中访问生成的 ObjectFactory?

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

@Override
public boolean run(Outline model, Options opt, ErrorHandler errorHandler) throws SAXException {
    for (ClassOutline classOutline : model.getClasses()) {
        //do something with the generated class
    }
}

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

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
        //...
    }
//...

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

public final static void useObjectFactory(Object input) {
    JAXBElement<SomeType> je = ((ObjectFactory) input).callMethodOfObjectFactory();
    //...
}

我不认为这是一种理想的方法,但它有效。 希望在某个时间点得到更好的答案,此时我不会接受我自己的答案。

您不会遍历类,而是遍历包并通过objectFactory()访问工厂。

@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
    }
}

顺便说一句,每个ObjectFactory都是在 xjc 处理 xml/json/etc 时“即时”创建的。 如果您在某些生成的JDefinedClass类中进行了手动类型更改,则需要手动调整对象工厂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM