Das Mapping von Klassen auf XML kann in Castor u.a. mit
“In mapping mode, the user provides Castor XML with a user-defined mapping (in form of a mapping file) that allows the (partial) definition of a customized mapping between Java classes (and their properties) and XML.”
(Castor Doku, http://castor.codehaus.org/xml-framework.html#Mapping-mode)
“In introspection mode, Castor XML uses Java reflection to establish the binding between the Java classes (and their properties) and the XML, …”
(Castor Doku, http://castor.codehaus.org/xml-framework.html#Introspection-mode)
Hat man eine Klassenhierarchie so kann immer nur ein Mode benutzt werden, z.B.:
Beim Marshalling passiert nun folgendes:
Hat man viele Klassen für das Marshalling und diese Klassen haben eine oder mehrere gemeinsame Basisklassen, so müsste man entweder
Immer Introspection zu verwenden ist oft nicht die passende Lösung - es werden zum Teil Elemente gemarshalled, die nicht gewünscht sind.
Die Klassen org.exolab.castor.xml.XMLClassDescriptorResolver und org.exolab.castor.xml.Introspector sind in
Castor für das Auflösen der XML-Definition verantwortlich. Ist das Mapping einer Klasse durch 
eine Mapping Datei definiert, so liefert XMLClassDescriptorResolver das Ergebnis, 
andernfalls wird zu Introspector delegiert. Die generateClassDescriptor-Methode wird im Introspector dann auch 
rekursiv für die Superklassen aufgerufen.

Mir einem eigenen Introspector, der die generateClassDescriptor Methoden übeschreibt, kann man die Aufrufe ggf. an XMLClassDescriptorResolver umleiten:

    public class CustomIntrospector extends Introspector  
    {  
      private final XMLClassDescriptorResolver resolver;  
      
      public CustomIntrospector(XMLClassDescriptorResolver resolver)  
      {  
        super();  
        this.resolver = resolver;  
      }  
      
      public CustomIntrospector(XMLClassDescriptorResolver resolver, ClassLoader classLoader)  
      {  
        super(classLoader);  
        this.resolver = resolver;  
      }  
      
      @Override  
      public XMLClassDescriptor generateClassDescriptor(Class c) throws MarshalException  
      {  
        return super.generateClassDescriptor(c,null);  
      }  
      
      @Override  
      public XMLClassDescriptor generateClassDescriptor(Class c, PrintWriter errorWriter) throws MarshalException  
      {  
        try  
        {  
          return (XMLClassDescriptor) resolver.resolve(c);  
        }  
        catch (ResolverException e)  
        {  
          throw new MarshalException(e);  
        }  
      }  
    }  
Da die Castor-Klassen Introspector und XMLClassDescriptorResolverImpl nicht so leicht anpassbar sind, muss man diese kopieren und an (sehr) wenigen Stellen anpassen.