2011-03-02 1 views
3

및 XJC과 생성 자바를 생성 (다른 사용자가 요구 한대로)으로는 java.util.Set을 생성 안 바운드 형식의 순서를 나타내는 필드의 형태 UntypedListField로 XJC에서 해당 유형의 필드를 캡처 한 것처럼 보이며 기본 동작은 java.util.List (getter 만)를 생성하는 것입니다. 나는 컬렉션 세터 - 인젝터 플러그인과 비슷한 일을하고 XJC는</p> <p>에 원하는 .... 다른 필드 유형 (get 메소드에 효과) 최신 JAXB (지하철)를 사용하여

public boolean run(Outline model, Options opt, ErrorHandler errorHandler) { 
    for (ClassOutline co : model.getClasses()) { 
     FieldOutline[] fo = co.getDeclaredFields(); 

     for ... 
      if ((fo[i] instanceof UntypedListField)) { 
      --> DO SOMETHING WITH THIS FIELD 
      } 
    } 
} 

어떻게 사람들이 유형을 조정하거나 쉽게 다음 새 필드를 구성 선언 필드의 세트를 대체하는 것입니다처럼 필드의 유형을 조정하면 수업 개요에? 필드의 타입을 망치는 것은 속성에서 get 메소드의 생성에 어떻게 영향을 줍니까?

+0

스키마의 관련 비트를 게시 할 수 있습니까? –

답변

1

자신 만의 XJC 플러그인을 사용하는 것처럼 보입니다. 그래서 여기 당신이해야 할 일이 있습니다. --> DO SOMETHING WITH THIS FIELD 줄을 다음으로 대체하십시오.

먼저 매개 변수화 유형이 fo[i] (f가 부름) 인 것을 확인하십시오. 그런 다음 Set JType을 작성하십시오. 그리고 마지막으로 setTypef의 유형을 설정합니다

JType inner = ((JClass)f.type()).getTypeParameters().get(0); 
JType setType = co.parent().getCodeModel().ref(Set.class).narrow(inner); 
f.type(setType); 

방법 narrow()는 매개 변수화 유형을 설정하는 데 사용됩니다.

하지만 지금까지는 문제가되지 않지만 XJC가 클래스를 생성 한 후에 플러그인이 실행됩니다. 즉 getter가 이미 있음을 의미합니다. 그래서 우리는 그것을 대체해야합니다. 여기

그리고는

private void replaceGetter(ClassOutline co, JFieldVar f, JType inner) { 
    //Create the method name 
    String get = "get"; 
    String name = f.name().substring(0, 1).toUpperCase() 
      + f.name().substring(1); 
    String methodName = get+name; 

    //Create HashSet JType 
    JType hashSetType = co.parent().getCodeModel().ref(HashSet.class).narrow(inner); 

    //Find and remove Old Getter! 
    JMethod oldGetter = co.implClass.getMethod(methodName, new JType[0]); 
    co.implClass.methods().remove(oldGetter); 

    //Create New Getter 
    JMethod getter = co.implClass.method(JMod.PUBLIC, f.type(), methodName); 

    //Create Getter Body -> {if (f = null) f = new HashSet(); return f;} 
    getter.body()._if(JExpr.ref(f.name()).eq(JExpr._null()))._then() 
    .assign(f, JExpr._new(hashSetType)); 

    getter.body()._return(JExpr.ref(f.name())); 
} 

당신이 도움이 희망 replaceGetter() 방법을합니다.