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

Java 如何在xjc插件代码中引用xjc生成的ObjectFactory类?,java,xjc,Java,Xjc,理想情况下,我希望向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

理想情况下,我希望向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
}
生成的代码应该如下所示:

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();
    //...
}
public最终静态void useObjectFactory(对象输入){
JAXBELENT je=((ObjectFactory)输入).callMethodOfObjectFactory();
//...
}

我认为这不是一个理想的方法,但它是有效的。希望在某个时候有一个更好的答案,我现在不接受我自己的答案。

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

@覆盖
公共布尔运行(大纲模型、选项opt、ErrorHandler ErrorHandler)引发SAXException{
对于(PackageOutline PackageOutline:model.getAllPackageContexts()){
JDefinedClass工厂=packageOutline.objectFactory();
//对于空包,factory可能为空
}
}
顺便说一句,每个
ObjectFactory
都是在xjc处理xml/json/等时“动态”创建的。如果在生成的
JDefinedClass
类中进行了手动类型更改,则需要手动调整对象工厂