\begin{slide}{Introspektion}

\begin{itemize}
\item
  \dots bezeichnet Ermitteln und Ausnutzen
  von Typinformationen zur Laufzeit
  (z. B. Klassen-Signaturen)
\item
  in Java kann diese Information aus class-files
  bzw. class-Objekten gewonnen werden 
  (Quelltext ist nicht notwendig)
\item
  steht in Widerspruch zu statischer (Compile-Zeit) Typprüfung?
  deren Ziel ist ja, daß man gar keine Laufzeit-Typinformation braucht.
\end{itemize}

\end{slide}

\begin{slide}{Introspektion (Beispiel)}
\begin{verbatim}
import java.lang.reflect.*;

Class c = baum.Baum.class;

for (Field f : c.getFields()) {
	System.out.println (f);
}

for (Method m : c.getMethods()) {
	System.out.println (m);
}
\end{verbatim}
  
\end{slide}

\begin{slide}{Zum Vergleich: Introspektion in Haskell}
\begin{verbatim}
data Rose a = 
     Rose { key :: a
          , children :: [ Rose a ]
          }
     deriving ( Typeable, Data )
\end{verbatim}
  \begin{small}
\begin{verbatim}
*Main> dataTypeOf $ make 2
DataType {tycon = "Main.Rose", datarep = AlgRep [Rose]}
*Main> dataTypeConstrs $ dataTypeOf $ make 2
[Rose]
*Main> map constrFields $ dataTypeConstrs $ dataTypeOf $ make 2
[["key","children"]]
\end{verbatim}
  \end{small}
\end{slide}

\begin{slide}{Zum Vergleich: Präprozessoren}

\begin{itemize}
\item
  Introspektion: Typinformation von Compilezeit zu Laufzeit retten
\item
  Präprozessoren (CPP, Template Haskell): 
  bereits zur Compilezeit echten Code ausführen
  (der dann Quelltext produziert, der kompiliert wird).
\end{itemize}

\end{slide}
