diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Reference Architectures and Patterns/hjp5/html/k100274.html | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100274.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100274.html | 1025 |
1 files changed, 1025 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100274.html b/Master/Reference Architectures and Patterns/hjp5/html/k100274.html new file mode 100644 index 0000000..ee97f1d --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100274.html @@ -0,0 +1,1025 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100271.html;106,k100273.html;107,k100275.html;108,k100279.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100271.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100273.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100275.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100279.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 43 - Reflection
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="reflectionmethodenaufrufe"></a>
+<h2>43.3 Methoden- und Konstruktorenaufrufe </h2>
+<hr>
+<ul>
+<li><a href="k100274.html#reflectionmethodenaufrufe">43.3 Methoden- und Konstruktorenaufrufe</a>
+<ul>
+<li><a href="k100274.html#sectlevel3id043003001">43.3.1 Parameterlose Methoden</a>
+<li><a href="k100274.html#fzeigerreflection">43.3.2 Parametrisierte Methoden</a>
+<li><a href="k100274.html#sectlevel3id043003003">43.3.3 Parametrisierte Konstruktoren</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id043003001"></a>
+<h3>43.3.1 Parameterlose Methoden </h3>
+
+<p>
+Wir wollen uns ein erstes Beispiel für die Anwendung des Reflection-APIs
+ansehen. In der Praxis stellt sich immer wieder das Problem, wohin
+bei neu entwickelten Klassen der Code zum <i>Testen</i> der Klasse
+geschrieben werden soll. Ein Weg ist der, an das Ende der Klasse eine
+Methode <font color="#000077"><tt>public static void main</tt></font>
+zu hängen und den Testcode dort zu platzieren:
+<a name="listingid043002"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Queue
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#00AA00">//...</font>
+<font color="#555555">004 </font> <font color="#00AA00">//Implementierung der Queue</font>
+<font color="#555555">005 </font> <font color="#00AA00">//...</font>
+<font color="#555555">006 </font>
+<font color="#555555">007 </font> <font color="#00AA00">//---Testcode------------------------------</font>
+<font color="#555555">008 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">009 </font> {
+<font color="#555555">010 </font> Queue q = <font color="#0000AA">new</font> Queue();
+<font color="#555555">011 </font> <font color="#00AA00">//...</font>
+<font color="#555555">012 </font> <font color="#00AA00">//Code zum Testen der Queue</font>
+<font color="#555555">013 </font> <font color="#00AA00">//...</font>
+<font color="#555555">014 </font> }
+<font color="#555555">015 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 43.2: Testcode in der main-Methode</i></p>
+
+<p>
+Auf diese Weise läßt sich der Testcode einer Dienstleistungsklasse
+- wie beispielsweise einer Queue - ganz einfach mit dem Java-Interpreter
+aufrufen und reproduzierbar testen. Nachteilig ist natürlich,
+dass der eigentliche Code und der Testcode vermischt werden. Dadurch
+wird die Klassendatei unnötig groß, was im Hinblick auf
+gute Downloadzeiten nicht wünschenswert ist. Besser wäre
+es, wenn der Testcode in einer separaten Klasse verbleiben würde.
+Wir wollen dazu ein kleines Programm zum Testen von Java-Klassen schreiben.
+Es soll folgende Eigenschaften besitzen:
+<ul>
+<li>Das Testing wird durch ein Rahmenprogramm <font color="#000077"><tt>Test</tt></font>
+ausgelöst, das als Argument den Namen der zu testenden Klasse
+erwartet.
+<li>Die zu testende Klasse soll automatisch gefunden, geladen und
+mit dem Default-Konstruktor instanziert werden.
+<li>In der Klasse mit dem Testcode sollen automatisch alle öffentlichen,
+nicht-statischen Methoden ausgeführt werden, deren Name mit »test«
+beginnt.
+</ul>
+
+<p>
+Der Schlüssel zur Implementierung der Klasse <font color="#000077"><tt>Test</tt></font>
+liegt in der Anwendung des Reflection-APIs. Das Laden der Testklasse
+entspricht dem vorigen Beispiel, zum Aufzählen aller Methoden
+bedienen wir uns der Methode <a name="ixa103171"><a href="index_g.html#ixb102336"><font color=#000080><tt>getMethods</tt></font></a></a>
+der Klasse <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public Method[] getMethods()
+ throws SecurityException
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/Class.html" onClick="this.href=getApiDoc('java.lang.Class')"><font color="#660066" size=-1>java.lang.Class</font></a></td>
+</tr>
+</table>
+
+<p>
+<a href="index_g.html#ixb102336"><font color=#000080><tt>getMethods</tt></font></a>
+liefert ein Array von Objekten des Typs <a name="ixa103172"><a href="index_m.html#ixb102337"><font color=#000080><tt>Method</tt></font></a></a>,
+das für jede öffentliche Methode der Klasse ein Element
+enthält. Um auch die nicht-öffentlichen Methoden aufzulisten,
+kann die Methode <a name="ixa103173"><a href="index_g.html#ixb102338"><font color=#000080><tt>getDeclaredMethods</tt></font></a></a>
+verwendet werden. Die Klasse <a href="index_m.html#ixb102337"><font color=#000080><tt>Method</tt></font></a>
+stellt einige Methoden zum Zugriff auf das Methodenobjekt zur Verfügung.
+Die wichtigsten sind:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+String getName()
+
+int getModifiers()
+
+Class[] getParameterTypes()
+
+Object invoke(Object obj, Object[] args)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/reflect/Method.html" onClick="this.href=getApiDoc('java.lang.reflect.Method')"><font color="#660066" size=-1>java.lang.reflect.Method</font></a></td>
+</tr>
+</table>
+
+<p>
+Mit <a name="ixa103174"><a href="index_g.html#ixb100667"><font color=#000080><tt>getName</tt></font></a></a>
+kann der Name der Methode ermittelt werden. <a name="ixa103175"><a href="index_g.html#ixb101415"><font color=#000080><tt>getModifiers</tt></font></a></a>
+liefert eine bitverknüpfte Darstellung der Methodenattribute
+(<a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a>,
+<a href="index_p.html#ixb100085"><font color=#000080><tt>private</tt></font></a>
+usw.). Der Rückgabewert kann an die statischen Methoden der Klasse
+<a name="ixa103176"><a href="index_m.html#ixb102339"><font color=#000080><tt>Modifier</tt></font></a></a>
+übergeben werden, um festzustellen, welche Attribute die Methode
+besitzt: <a name="ixa103177"></a> <a name="ixa103178"></a> <a name="ixa103179"></a>
+<a name="ixa103180"></a> <a name="ixa103181"></a> <a name="ixa103182"></a>
+<a name="ixa103183"></a> <a name="ixa103184"></a> <a name="ixa103185"></a>
+<a name="ixa103186"></a> <a name="ixa103187"></a> <a name="ixa103188"></a>
+<a name="ixa103189"></a>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+static boolean isAbstract(int mod)
+static boolean isExplicit(int mod)
+static boolean isFinal(int mod)
+static boolean isInterface(int mod)
+static boolean isNative(int mod)
+static boolean isPrivate(int mod)
+static boolean isProtected(int mod)
+static boolean isPublic(int mod)
+static boolean isStatic(int mod)
+static boolean isStrict(int mod)
+static boolean isSynchronized(int mod)
+static boolean isTransient(int mod)
+static boolean isVolatile(int mod)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/reflect/Modifier.html" onClick="this.href=getApiDoc('java.lang.reflect.Modifier')"><font color="#660066" size=-1>java.lang.reflect.Modifier</font></a></td>
+</tr>
+</table>
+
+<p>
+<a name="ixa103190"><a href="index_g.html#ixb102353"><font color=#000080><tt>getParameterTypes</tt></font></a></a>
+liefert ein Array mit Objekten des Typs <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>,
+das dazu verwendet werden kann, die Anzahl und Typen der formalen
+Argumente der Methode festzustellen. Jedes Array-Element repräsentiert
+dabei die Klasse des korrespondierenden formalen Arguments. Hat das
+Array die Länge 0, so ist die Methode parameterlos. Gibt es beispielsweise
+zwei Elemente mit den Typen <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+und <a href="index_d.html#ixb100255"><font color=#000080><tt>Double</tt></font></a>,
+so besitzt die Methode zwei Parameter, die vom Typ <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+und <a href="index_d.html#ixb100255"><font color=#000080><tt>Double</tt></font></a>
+sind.
+
+<p>
+Um auch primitive Typen auf diese Weise darstellen zu können,
+gibt es in den Wrapper-Klassen der primitiven Typen (siehe <a href="k100066.html#wrapperklassen">Abschnitt 10.2</a>)
+jeweils ein statisches <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>-Objekt
+mit der Bezeichnung <a name="ixa103191"><a href="index_t.html#ixb102354"><font color=#000080><tt>TYPE</tt></font></a></a>,
+das den zugehörigen primitiven Datentyp bezeichnet. Ein <a href="index_i.html#ixb100244"><font color=#000080><tt>int</tt></font></a>-Argument
+wird also beispielsweise dadurch angezeigt, dass der Rückgabewert
+von <a href="index_g.html#ixb102353"><font color=#000080><tt>getParameterTypes</tt></font></a>
+an der entsprechenden Stelle ein Objekt des Typs <a name="ixa103192"><a href="index_i.html#ixb102355"><font color=#000080><tt>Integer.TYPE</tt></font></a></a>
+enthält.<a name="ixa103193"></a> Insgesamt gibt es neun derartige
+Klassenobjekte, und zwar für die acht primitiven Typen und für
+den »leeren« Rückgabewert <a href="index_v.html#ixb100334"><font color=#000080><tt>void</tt></font></a>:
+<a name="tableid043001"></a>
+<p>
+<table cols=2 border width=66%>
+
+<tr>
+<td valign=top align=left width=66%><b>Klassenobjekt </b></td>
+<td valign=top align=left width=33%><b>Typ</b></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103194"><a href="index_b.html#ixb102357"><font color=#000080><tt>Boolean.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_b.html#ixb100072"><font color=#000080><tt>boolean</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103195"><a href="index_c.html#ixb102358"><font color=#000080><tt>Character.TYPE</tt></font></a></a></td>
+<td valign=top align=left><a href="index_c.html#ixb100215"><font color=#000080><tt>char</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103196"><a href="index_b.html#ixb102359"><font color=#000080><tt>Byte.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_b.html#ixb100242"><font color=#000080><tt>byte</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103197"><a href="index_s.html#ixb102360"><font color=#000080><tt>Short.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_s.html#ixb100243"><font color=#000080><tt>short</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103192"><a href="index_i.html#ixb102355"><font color=#000080><tt>Integer.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_i.html#ixb100244"><font color=#000080><tt>int</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103198"><a href="index_l.html#ixb102361"><font color=#000080><tt>Long.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_l.html#ixb100245"><font color=#000080><tt>long</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103199"><a href="index_f.html#ixb102362"><font color=#000080><tt>Float.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_f.html#ixb100246"><font color=#000080><tt>float</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103200"><a href="index_d.html#ixb102363"><font color=#000080><tt>Double.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_d.html#ixb100247"><font color=#000080><tt>double</tt></font></a></td></tr>
+<tr>
+<td valign=top align=left><a name="ixa103201"><a href="index_v.html#ixb102364"><font color=#000080><tt>Void.TYPE</tt></font></a></a>
+</td>
+<td valign=top align=left><a href="index_v.html#ixb100334"><font color=#000080><tt>void</tt></font></a></td></tr>
+</table>
+<p><i>
+Tabelle 43.1: Klassenobjekte für die primitiven Typen</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Alternativ zur .TYPE-Notation kann auch die in <a href="k100274.html#fzeigerreflection">Abschnitt 43.3.2</a>
+vorgestellte .class-Notation verwendet werden, um Klassenobjekte für
+primitive Typen zu erzeugen. Dazu ist einfach der Name des gewünschten
+Typs um ».class« zu ergänzen, also z.B. <font color="#000077"><tt>boolean.class</tt></font>
+oder <font color="#000077"><tt>void.class</tt></font> zu schreiben.
+Der Compiler erzeugt dann ein passendes Klassenobjekt für den
+primitiven Typ.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Die Methode <a name="ixa103202"><a href="index_i.html#ixb102365"><font color=#000080><tt>invoke</tt></font></a></a>
+der Klasse <a href="index_m.html#ixb102337"><font color=#000080><tt>Method</tt></font></a>
+dient dazu, die durch dieses Methodenobjekt repräsentierte Methode
+tatsächlich aufzurufen. Das erste Argument <font color="#000077"><tt>obj</tt></font>
+gibt dabei das Objekt an, auf dem die Methode ausgeführt werden
+soll. Es muss natürlich zu einem Objekt der Klasse gehören,
+auf der <a href="index_g.html#ixb102336"><font color=#000080><tt>getMethods</tt></font></a>
+aufgerufen wurde. Das zweite Argument übergibt die aktuellen
+Parameter an die Methode. Ähnlich wie bei <a href="index_g.html#ixb102353"><font color=#000080><tt>getParameterTypes</tt></font></a>
+wird auch hier ein Array angegeben, dessen Elemente den korrespondierenden
+aktuellen Argumenten entsprechen. Bei Objektparametern ist einfach
+ein Objekt des passenden Typs an der gewünschten Stelle zu platzieren.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Besitzt die Methode auch primitive Argumente, wird eine automatische
+Konvertierung vorgenommen (<a name="ixa103203"><i>unwrapping</i></a>),
+indem das entsprechende Array-Element in den passenden primitiven
+Datentyp konvertiert wird. Erwartet die Methode beispielsweise ein
+<a href="index_i.html#ixb100244"><font color=#000080><tt>int</tt></font></a>,
+so ist ein <a href="index_i.html#ixb100170"><font color=#000080><tt>Integer</tt></font></a>-Objekt
+zu übergeben, das dann beim Aufruf automatisch »ausgepackt«
+wird.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Die Implementierung der Klasse <font color="#000077"><tt>Test</tt></font>
+sieht so aus:
+<a name="testapp"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Test.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.lang.reflect.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Test
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> Object createTestObject(String name)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#00AA00">//Klassennamen zusammenbauen</font>
+<font color="#555555">010 </font> <font color="#006699">int</font> pos = name.lastIndexOf(<font color="#0000FF">'.'</font>);
+<font color="#555555">011 </font> <font color="#0000AA">if</font> (pos == -1) {
+<font color="#555555">012 </font> name = <font color="#0000FF">"Test"</font> + name;
+<font color="#555555">013 </font> } <font color="#0000AA">else</font> {
+<font color="#555555">014 </font> name = name.substring(0, pos + 1) + <font color="#0000FF">"Test"</font> +
+<font color="#555555">015 </font> name.substring(pos + 1);
+<font color="#555555">016 </font> }
+<font color="#555555">017 </font> <font color="#00AA00">//Klasse laden</font>
+<font color="#555555">018 </font> Object ret = <font color="#006699">null</font>;
+<font color="#555555">019 </font> <font color="#0000AA">try</font> {
+<font color="#555555">020 </font> Class testclass = Class.forName(name);
+<font color="#555555">021 </font> <font color="#00AA00">//Testobjekt instanzieren</font>
+<font color="#555555">022 </font> System.out.println(<font color="#0000FF">"=============================="</font>);
+<font color="#555555">023 </font> System.out.println(<font color="#0000FF">"Instanzieren von: "</font> + name);
+<font color="#555555">024 </font> System.out.println(<font color="#0000FF">"--"</font>);
+<font color="#555555">025 </font> ret = testclass.newInstance();
+<font color="#555555">026 </font> } <font color="#0000AA">catch</font> (ClassNotFoundException e) {
+<font color="#555555">027 </font> System.err.println(<font color="#0000FF">"Kann Klasse nicht laden: "</font> + name);
+<font color="#555555">028 </font> } <font color="#0000AA">catch</font> (InstantiationException e) {
+<font color="#555555">029 </font> System.err.println(<font color="#0000FF">"Fehler beim Instanzieren: "</font> + name);
+<font color="#555555">030 </font> } <font color="#0000AA">catch</font> (IllegalAccessException e) {
+<font color="#555555">031 </font> System.err.println(<font color="#0000FF">"Unerlaubter Zugriff auf: "</font> + name);
+<font color="#555555">032 </font> }
+<font color="#555555">033 </font> <font color="#0000AA">return</font> ret;
+<font color="#555555">034 </font> }
+<font color="#555555">035 </font>
+<font color="#555555">036 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> runTests(Object tester)
+<font color="#555555">037 </font> {
+<font color="#555555">038 </font> Class clazz = tester.getClass();
+<font color="#555555">039 </font> Method[] methods = clazz.getMethods();
+<font color="#555555">040 </font> <font color="#006699">int</font> cnt = 0;
+<font color="#555555">041 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 0; i < methods.length; ++i) {
+<font color="#555555">042 </font> <font color="#00AA00">//Methodenname muss mit "test" anfangen</font>
+<font color="#555555">043 </font> String name = methods[i].getName();
+<font color="#555555">044 </font> <font color="#0000AA">if</font> (!name.startsWith(<font color="#0000FF">"test"</font>)) {
+<font color="#555555">045 </font> <font color="#0000AA">continue</font>;
+<font color="#555555">046 </font> }
+<font color="#555555">047 </font> <font color="#00AA00">//Methode muss parameterlos sein</font>
+<font color="#555555">048 </font> Class[] paras = methods[i].getParameterTypes();
+<font color="#555555">049 </font> <font color="#0000AA">if</font> (paras.length > 0) {
+<font color="#555555">050 </font> <font color="#0000AA">continue</font>;
+<font color="#555555">051 </font> }
+<font color="#555555">052 </font> <font color="#00AA00">//Methode darf nicht static sein</font>
+<font color="#555555">053 </font> <font color="#006699">int</font> modifiers = methods[i].getModifiers();
+<font color="#555555">054 </font> <font color="#0000AA">if</font> (Modifier.isStatic(modifiers)) {
+<font color="#555555">055 </font> <font color="#0000AA">continue</font>;
+<font color="#555555">056 </font> }
+<font color="#555555">057 </font> <font color="#00AA00">//Nun kann die Methode aufgerufen werden</font>
+<font color="#555555">058 </font> ++cnt;
+<font color="#555555">059 </font> System.out.println(<font color="#0000FF">"=============================="</font>);
+<font color="#555555">060 </font> System.out.println(<font color="#0000FF">"Aufgerufen wird: "</font> + name);
+<font color="#555555">061 </font> System.out.println(<font color="#0000FF">"--"</font>);
+<font color="#555555">062 </font> <font color="#0000AA">try</font> {
+<font color="#555555">063 </font> methods[i].invoke(tester, <font color="#0000AA">new</font> Object[0]);
+<font color="#555555">064 </font> } <font color="#0000AA">catch</font> (Exception e) {
+<font color="#555555">065 </font> System.err.println(e.toString());
+<font color="#555555">066 </font> }
+<font color="#555555">067 </font> }
+<font color="#555555">068 </font> <font color="#0000AA">if</font> (cnt <= 0) {
+<font color="#555555">069 </font> System.out.println(<font color="#0000FF">"Keine Testmethoden gefunden"</font>);
+<font color="#555555">070 </font> }
+<font color="#555555">071 </font> }
+<font color="#555555">072 </font>
+<font color="#555555">073 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">074 </font> {
+<font color="#555555">075 </font> <font color="#0000AA">if</font> (args.length <= 0) {
+<font color="#555555">076 </font> System.err.println(<font color="#0000FF">"Aufruf: java Test <KlassenName>"</font>);
+<font color="#555555">077 </font> System.exit(1);
+<font color="#555555">078 </font> }
+<font color="#555555">079 </font> Object tester = createTestObject(args[0]);
+<font color="#555555">080 </font> runTests(tester);
+<font color="#555555">081 </font> }
+<font color="#555555">082 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Test.java"><font color="#000055" size=-1>Test.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 43.3: Die Klasse Test</i></p>
+
+<p>
+Das Hauptprogramm ruft zunächst die Methode <font color="#000077"><tt>createTestObject</tt></font>
+auf, um ein Objekt der Testklasse zu generieren. Falls als Argument
+also beispielsweise <font color="#000077"><tt>Queue</tt></font> übergeben
+wurde, wird ein Objekt des Typs <font color="#000077"><tt>TestQueue</tt></font>
+erzeugt. Ist es nicht vorhanden oder kann nicht instanziert werden,
+liefert die Methode <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>
+als Rückgabewert.
+
+<p>
+Anschließend wird das Testobjekt an die Methode <font color="#000077"><tt>runTests</tt></font>
+übergeben. Diese besorgt sich das Klassenobjekt und ruft <a href="index_g.html#ixb102336"><font color=#000080><tt>getMethods</tt></font></a>
+auf. Das zurückgegebene Array repräsentiert die Liste aller
+öffentlichen Methoden und wird elementweise durchlaufen. Zunächst
+wird überprüft, ob der Methodenname mit <font color="#000077"><tt>test</tt></font>
+anfängt. Ist das der Fall, wird geprüft, ob die Methode
+parameterlos ist und nicht das <a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a>-Attribut
+besitzt. Sind auch diese Bedingungen erfüllt, kann die Methode
+mit <a href="index_i.html#ixb102365"><font color=#000080><tt>invoke</tt></font></a>
+aufgerufen werden. Als erstes Argument wird das Testobjekt übergeben.
+Als zweites folgt ein leeres Array des Typs <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>,
+um anzuzeigen, dass keine Parameter zu übergeben sind.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Beachten Sie, dass am Anfang des Programms das Paket <a name="ixa103204"><a href="index_j.html#ixb100596"><font color=#000080><tt>java.lang.reflect</tt></font></a></a>
+eingebunden wurde. Während die Klassen <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>
+und <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>
+aus historischen Gründen in <a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a>
+liegen (und deshalb automatisch importiert werden), liegen sie für
+die übrigen Bestandteile des Reflection-APIs in <a href="index_j.html#ixb100596"><font color=#000080><tt>java.lang.reflect</tt></font></a>
+und müssen deshalb explizit importiert werden.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Eine beispielhafte Implementierung der Klasse <font color="#000077"><tt>TestQueue</tt></font>
+könnte etwa so aussehen:
+<a name="listingid043004"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> TestQueue
+<font color="#555555">002 </font>{
+<font color="#555555">003 </font> <font color="#0000AA">public</font> TestQueue()
+<font color="#555555">004 </font> {
+<font color="#555555">005 </font> <font color="#00AA00">//Intialisierungen, z.B. Erzeugen eines zu</font>
+<font color="#555555">006 </font> <font color="#00AA00">//testenden Queue-Objekts</font>
+<font color="#555555">007 </font> }
+<font color="#555555">008 </font>
+<font color="#555555">009 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> test1()
+<font color="#555555">010 </font> {
+<font color="#555555">011 </font> <font color="#00AA00">//Erste Testmethode</font>
+<font color="#555555">012 </font> }
+<font color="#555555">013 </font>
+<font color="#555555">014 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> test2()
+<font color="#555555">015 </font> {
+<font color="#555555">016 </font> <font color="#00AA00">//Zweite Testmethode</font>
+<font color="#555555">017 </font> }
+<font color="#555555">018 </font>
+<font color="#555555">019 </font> <font color="#00AA00">//...</font>
+<font color="#555555">020 </font>}</pre>
+</font>
+</td>
+</tr>
+</table>
+<i>
+Listing 43.4: Die Klasse TestQueue</i></p>
+
+<p>
+Ein Aufruf von
+<font color="#000077">
+<pre>
+java Test Queue
+</pre>
+</font>
+
+<p>
+würde nun ein neues Objekt des Typs <font color="#000077"><tt>TestQueue</tt></font>
+instanzieren und nacheinander die Methoden <font color="#000077"><tt>test1</tt></font>,
+<font color="#000077"><tt>test2</tt></font> usw. aufrufen.
+
+<!-- Section -->
+
+<a name="fzeigerreflection"></a>
+<h3>43.3.2 Parametrisierte Methoden<a name="ixa103205"></a> </h3>
+
+<p>
+In diesem Abschnitt wollen wir uns den Aufruf <i>parametrisierter</i>
+Methoden ansehen, was nach den Ausführungen des vorigen Abschnitts
+nicht mehr schwierig ist. Als Beispiel soll ein Programm geschrieben
+werden, das die in Java nicht vorhandenen Funktionszeiger simuliert.
+Es soll eine Methode enthalten, die eine Wertetabelle für eine
+mathematische Funktion erzeugt, deren Name als String übergeben
+wurde. Nach den Überlegungen des vorigen Abschnitts können
+wir uns gleich das Listing ansehen:
+<a name="floattables"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* FloatTables.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.lang.reflect.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> FloatTables
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">double</font> times2(<font color="#006699">double</font> value)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#0000AA">return</font> 2 * value;
+<font color="#555555">010 </font> }
+<font color="#555555">011 </font>
+<font color="#555555">012 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">double</font> sqr(<font color="#006699">double</font> value)
+<font color="#555555">013 </font> {
+<font color="#555555">014 </font> <font color="#0000AA">return</font> value * value;
+<font color="#555555">015 </font> }
+<font color="#555555">016 </font>
+<font color="#555555">017 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> printTable(String methname)
+<font color="#555555">018 </font> {
+<font color="#555555">019 </font> <font color="#0000AA">try</font> {
+<font color="#555555">020 </font> System.out.println(<font color="#0000FF">"Wertetabelle fuer "</font> + methname);
+<font color="#555555">021 </font> <font color="#006699">int</font> pos = methname.lastIndexOf(<font color="#0000FF">'.'</font>); <a name="floattables.a"></a>
+<font color="#555555">022 </font> Class clazz;
+<font color="#555555">023 </font> <font color="#0000AA">if</font> (pos == -1) {
+<font color="#555555">024 </font> clazz = FloatTables.<font color="#0000AA">class</font>;
+<font color="#555555">025 </font> } <font color="#0000AA">else</font> {
+<font color="#555555">026 </font> clazz = Class.forName(methname.substring(0, pos));
+<font color="#555555">027 </font> methname = methname.substring(pos + 1);
+<font color="#555555">028 </font> }
+<font color="#555555">029 </font> Class[] formparas = <font color="#0000AA">new</font> Class[1];
+<font color="#555555">030 </font> formparas[0] = Double.TYPE;
+<font color="#555555">031 </font> Method meth = clazz.getMethod(methname, formparas);
+<font color="#555555">032 </font> <font color="#0000AA">if</font> (!Modifier.isStatic(meth.getModifiers())) {
+<font color="#555555">033 </font> <font color="#0000AA">throw</font> <font color="#0000AA">new</font> Exception(methname + <font color="#0000FF">" ist nicht static"</font>);
+<font color="#555555">034 </font> }
+<font color="#555555">035 </font> Object[] actargs = <font color="#0000AA">new</font> Object[1];
+<font color="#555555">036 </font> <font color="#0000AA">for</font> (<font color="#006699">double</font> x = 0.0; x <= 5.0; x += 1) {
+<font color="#555555">037 </font> actargs[0] = <font color="#0000AA">new</font> Double(x); <a name="floattables.b"></a>
+<font color="#555555">038 </font> Double ret = (Double)meth.invoke(<font color="#006699">null</font>, actargs);
+<font color="#555555">039 </font> <font color="#006699">double</font> result = ret.doubleValue();
+<font color="#555555">040 </font> System.out.println(<font color="#0000FF">" "</font> + x + <font color="#0000FF">" -> "</font> + result);
+<font color="#555555">041 </font> }
+<font color="#555555">042 </font> } <font color="#0000AA">catch</font> (Exception e) {
+<font color="#555555">043 </font> System.err.println(e.toString());
+<font color="#555555">044 </font> }
+<font color="#555555">045 </font> }
+<font color="#555555">046 </font>
+<font color="#555555">047 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">048 </font> {
+<font color="#555555">049 </font> printTable(<font color="#0000FF">"times2"</font>);
+<font color="#555555">050 </font> printTable(<font color="#0000FF">"java.lang.Math.exp"</font>);
+<font color="#555555">051 </font> printTable(<font color="#0000FF">"sqr"</font>);
+<font color="#555555">052 </font> printTable(<font color="#0000FF">"java.lang.Math.sqrt"</font>);
+<font color="#555555">053 </font> }
+<font color="#555555">054 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/FloatTables.java"><font color="#000055" size=-1>FloatTables.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 43.5: Funktionszeiger mit Reflection nachbilden</i></p>
+
+<p>
+Das Hauptprogramm ruft die Methode <font color="#000077"><tt>printTable</tt></font>
+viermal auf, um die Wertetabellen zu den statischen Funktionen <font color="#000077"><tt>times2</tt></font>,
+<font color="#000077"><tt>java.lang.Math.exp</tt></font>, <font color="#000077"><tt>sqr</tt></font>
+und <font color="#000077"><tt>java.lang.Math.sqrt</tt></font> zu erzeugen.
+Sie kann sowohl mit lokal definierten Methoden umgehen als auch mit
+solchen, die in einer anderen Klasse liegen (in diesem Fall sogar
+aus einem anderen Paket).
+
+<p>
+In <a href="k100274.html#floattables.a">Zeile 021</a> wird zunächst
+der am weitesten rechts stehende Punkt im Methodennamen gesucht. Ist
+ein Punkt vorhanden, wird der String an dieser Stelle aufgeteilt.
+Der links davon stehende Teil wird als Klassenname angesehen, der
+rechts davon stehende als Methodenname. Gibt es keinen Punkt, wird
+als Klassenname der Name der eigenen Klasse verwendet. Anschließend
+wird das zugehörige Klassenobjekt geladen.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Ist der Klassenname zur Compilezeit bekannt, kann anstelle des Aufrufs
+von <a name="ixa103206"><a href="index_f.html#ixb102240"><font color=#000080><tt>forName</tt></font></a></a>
+die abkürzende Schreibweise <font color="#000077"><tt>.class</tt></font><a name="ixa103207"></a>
+verwendet werden. Das hat den Vorteil, dass bereits der Compiler überprüfen
+kann, ob die genannte Klasse vorhanden ist.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Anders als im vorigen Abschnitt generiert das Programm nun nicht eine
+Liste <i>aller</i> Methoden, sondern sucht mit <a name="ixa103208"><a href="index_g.html#ixb102368"><font color=#000080><tt>getMethod</tt></font></a></a>
+ganz konkret nach einer bestimmten:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public Method getMethod(String name, Class[] parameterTypes)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/Class.html" onClick="this.href=getApiDoc('java.lang.Class')"><font color="#660066" size=-1>java.lang.Class</font></a></td>
+</tr>
+</table>
+
+<p>
+Dazu müssen der Name der Methode und eine Beschreibung ihrer
+formalen Argumente an <a href="index_g.html#ixb102368"><font color=#000080><tt>getMethod</tt></font></a>
+übergeben werden. Auch hier werden die Argumente durch ein Array
+mit korrespondierenden Klassenobjekten repräsentiert. Da die
+Methoden, die in diesem Fall aufgerufen werden sollen, nur ein einziges
+Argument vom Typ <a href="index_d.html#ixb100247"><font color=#000080><tt>double</tt></font></a>
+haben sollen, hat unsere Parameterspezifikation <font color="#000077"><tt>formParas</tt></font>
+lediglich ein einziges Element <a name="ixa103209"><a href="index_d.html#ixb102363"><font color=#000080><tt>Double.TYPE</tt></font></a></a>.
+Wurde keine solche Methode gefunden oder besitzt sie nicht das <a href="index_s.html#ixb100422"><font color=#000080><tt>static</tt></font></a>-Attribut,
+löst <a href="index_g.html#ixb102336"><font color=#000080><tt>getMethods</tt></font></a>
+eine Ausnahme des Typs <a name="ixa103210"><a href="index_n.html#ixb102369"><font color=#000080><tt>NoSuchMethodException</tt></font></a></a>
+aus.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Würde die Methode anstelle des primitiven Typs <a href="index_d.html#ixb100247"><font color=#000080><tt>double</tt></font></a>
+ein Argument des Referenztyps <a href="index_d.html#ixb100255"><font color=#000080><tt>Double</tt></font></a>
+erwarten, hätten wir ein Klassenobjekt der Klasse <a href="index_d.html#ixb100255"><font color=#000080><tt>Double</tt></font></a>
+übergeben müssen. Dafür gibt es verschiedene Möglichkeiten,
+beispielsweise die beiden folgenden:
+<font color="#000077">
+<pre>
+formparas[0] = (new Double(0)).getClass();
+</pre>
+</font>
+
+<p>
+oder
+<font color="#000077">
+<pre>
+formparas[0] = Double.class;
+</pre>
+</font>
+</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
+<tr>
+<td><font color="#FFFFFF"> Tipp </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Auch eine parametrisierte Methode kann mit <a name="ixa103211"><a href="index_i.html#ixb102365"><font color=#000080><tt>invoke</tt></font></a></a>
+aufgerufen werden. Im Unterschied zur parameterlosen muss nun allerdings
+ein nicht-leeres <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>-Array
+mit den aktuellen Argumenten übergeben werden. Hier zeigt sich
+ein vermeintliches Problem, denn in einem Array vom <font color="#000077"><tt>Object[]</tt></font>
+können keine primitiven Typen abgelegt werden. Um Methoden mit
+primitiven Parametern aufrufen zu können, werden diese einfach
+in die passende Wrapper-Klasse verpackt (siehe <a href="k100066.html#wrapperklassen">Abschnitt 10.2</a>).
+Beim Aufruf von <a href="index_i.html#ixb102365"><font color=#000080><tt>invoke</tt></font></a>
+werden sie dann automatisch »ausgepackt« und dem primitiven
+Argument zugewiesen.
+
+<p>
+Wir verpacken also den zu übergebenden Wert in ein <a href="index_d.html#ixb100255"><font color=#000080><tt>Double</tt></font></a>-Objekt
+und stellen dieses in <a href="k100274.html#floattables.b">Zeile 037</a>
+in das Array mit den aktuellen Argumenten. Beim Methodenaufruf in
+der nächsten Zeile wird es dann automatisch ausgepackt und steht
+innerhalb der Methode als <a href="index_d.html#ixb100247"><font color=#000080><tt>double</tt></font></a>-Wert
+zur Verfügung. Das Programm ruft die Methode für jeden der
+Werte 0.0, 1.0, 2.0, 3.0, 4.0 und 5.0 auf und erzeugt so eine einfache
+Wertetabelle.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Anders als in <a href="k100274.html#testapp">Listing 43.3</a> wird
+in diesem Beispiel als erstes Argument von <a href="index_i.html#ixb102365"><font color=#000080><tt>invoke</tt></font></a>
+nicht das Objekt übergeben, an dem die Methode aufgerufen werden
+soll, sondern der Wert <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>.
+Das liegt daran, dass wir eine <i>statische</i> Methode aufrufen,
+die keiner Objektinstanz, sondern dem Klassenobjekt zugeordnet ist.
+Bei nicht-statischen Methoden ist die Übergabe von <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>
+natürlich nicht erlaubt und würde zu einer <a name="ixa103212"><a href="index_n.html#ixb101859"><font color=#000080><tt>NullPointerException</tt></font></a></a>
+führen.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+<p>
+Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+Wertetabelle fuer times2
+ 0.0 -> 0.0
+ 1.0 -> 2.0
+ 2.0 -> 4.0
+ 3.0 -> 6.0
+ 4.0 -> 8.0
+ 5.0 -> 10.0
+Wertetabelle fuer java.lang.Math.exp
+ 0.0 -> 1.0
+ 1.0 -> 2.7182818284590455
+ 2.0 -> 7.38905609893065
+ 3.0 -> 20.085536923187668
+ 4.0 -> 54.598150033144236
+ 5.0 -> 148.4131591025766
+Wertetabelle fuer sqr
+ 0.0 -> 0.0
+ 1.0 -> 1.0
+ 2.0 -> 4.0
+ 3.0 -> 9.0
+ 4.0 -> 16.0
+ 5.0 -> 25.0
+Wertetabelle fuer java.lang.Math.sqrt
+ 0.0 -> 0.0
+ 1.0 -> 1.0
+ 2.0 -> 1.4142135623730951
+ 3.0 -> 1.7320508075688772
+ 4.0 -> 2.0
+ 5.0 -> 2.23606797749979
+</pre>
+</font>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Der in <a href="k100274.html#floattables">Listing 43.5</a> vorgestellte
+Code ist eigentlich nicht zur Nachahmung empfohlen, sondern soll nur
+als Beispiel für den Aufruf parametrisierter Methoden mit Hilfe
+des Reflection-APIs dienen. Ein zum hier vorgestellten Code äquivalentes
+Beispiel auf der Basis von Interfaces wurde in <a href="k100061.html#fzeigerinterfaces">Abschnitt 9.4.3</a>
+vorgestellt.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id043003003"></a>
+<h3>43.3.3 Parametrisierte Konstruktoren </h3>
+
+<p>
+Die Methode <a href="index_n.html#ixb102334"><font color=#000080><tt>newInstance</tt></font></a>
+der Klasse <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>
+ruft immer den parameterlosen Konstruktor auf, um ein Objekt zu instanzieren.
+Mit Reflection ist es aber auch möglich, parametrisierte Konstruktoren
+zur dynamischen Instanzierung zu verwenden. Dazu besitzt <a href="index_c.html#ixb100641"><font color=#000080><tt>Class</tt></font></a>
+zwei Methoden <a name="ixa103213"><a href="index_g.html#ixb102370"><font color=#000080><tt>getConstructors</tt></font></a></a>
+und <a name="ixa103214"><a href="index_g.html#ixb102371"><font color=#000080><tt>getConstructor</tt></font></a></a>,
+die dazu verwendet werden, Konstruktorenobjekte zu beschaffen. Anders
+als <a href="index_g.html#ixb102336"><font color=#000080><tt>getMethods</tt></font></a>
+und <a href="index_g.html#ixb102368"><font color=#000080><tt>getMethod</tt></font></a>
+liefern sie allerdings kein Objekt des Typs <a href="index_m.html#ixb102337"><font color=#000080><tt>Method</tt></font></a>,
+sondern eines des Typs <a name="ixa103215"><a href="index_c.html#ixb102372"><font color=#000080><tt>Constructor</tt></font></a></a>
+zurück.
+
+<p>
+Auch dieses besitzt die oben beschriebenen Methoden <a name="ixa103216"><a href="index_g.html#ixb101415"><font color=#000080><tt>getModifiers</tt></font></a></a>,
+<a name="ixa103217"><a href="index_g.html#ixb100667"><font color=#000080><tt>getName</tt></font></a></a>
+und <a name="ixa103218"><a href="index_g.html#ixb102353"><font color=#000080><tt>getParameterTypes</tt></font></a></a>.
+Der Aufruf einer Methode erfolgt allerdings nicht mit <a href="index_i.html#ixb102365"><font color=#000080><tt>invoke</tt></font></a>,
+sondern mit <a name="ixa103219"><a href="index_n.html#ixb102334"><font color=#000080><tt>newInstance</tt></font></a></a>:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+Object newInstance(Object[] initargs)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/lang/reflect/Constructor.html" onClick="this.href=getApiDoc('java.lang.reflect.Constructor')"><font color="#660066" size=-1>java.lang.reflect.Constructor</font></a></td>
+</tr>
+</table>
+
+<p>
+<a href="index_n.html#ixb102334"><font color=#000080><tt>newInstance</tt></font></a>
+erwartet ebenfalls ein Array von Argumenten des Typs <a href="index_o.html#ixb100224"><font color=#000080><tt>Object</tt></font></a>.
+Diese werden gegebenenfalls in der zuvor beschriebenen Weise auf primitive
+Typen abgebildet und rufen schließlich den passenden Konstruktor
+auf. Als Rückgabewert von <a href="index_n.html#ixb102334"><font color=#000080><tt>newInstance</tt></font></a>
+wird das neu instanzierte Objekt geliefert.
+
+<p>
+Das folgende Listing zeigt die Verwendung parametrisierter Konstruktoren
+mit dem Reflection-API:
+<a name="listingid043006"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing4306.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.lang.reflect.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing4306
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> Class clazz = TestConstructors.<font color="#0000AA">class</font>;
+<font color="#555555">010 </font> <font color="#00AA00">//Formale Parameter definieren</font>
+<font color="#555555">011 </font> Class[] formparas = <font color="#0000AA">new</font> Class[2];
+<font color="#555555">012 </font> formparas[0] = String.<font color="#0000AA">class</font>;
+<font color="#555555">013 </font> formparas[1] = String.<font color="#0000AA">class</font>;
+<font color="#555555">014 </font> <font color="#0000AA">try</font> {
+<font color="#555555">015 </font> Constructor cons = clazz.getConstructor(formparas);
+<font color="#555555">016 </font> <font color="#00AA00">//Aktuelle Argumente definieren</font>
+<font color="#555555">017 </font> Object[] actargs = <font color="#0000AA">new</font> Object[] {<font color="#0000FF">"eins"</font>, <font color="#0000FF">"zwei"</font>};
+<font color="#555555">018 </font> Object obj = cons.newInstance(actargs);
+<font color="#555555">019 </font> ((TestConstructors)obj).print();
+<font color="#555555">020 </font> } <font color="#0000AA">catch</font> (Exception e) {
+<font color="#555555">021 </font> System.err.println(e.toString());
+<font color="#555555">022 </font> System.exit(1);
+<font color="#555555">023 </font> }
+<font color="#555555">024 </font> }
+<font color="#555555">025 </font>}
+<font color="#555555">026 </font>
+<font color="#555555">027 </font><font color="#0000AA">class</font> TestConstructors
+<font color="#555555">028 </font>{
+<font color="#555555">029 </font> <font color="#0000AA">private</font> String arg1;
+<font color="#555555">030 </font> <font color="#0000AA">private</font> String arg2;
+<font color="#555555">031 </font>
+<font color="#555555">032 </font> <font color="#0000AA">public</font> TestConstructors()
+<font color="#555555">033 </font> {
+<font color="#555555">034 </font> arg1 = <font color="#0000FF">"leer"</font>;
+<font color="#555555">035 </font> arg2 = <font color="#0000FF">"leer"</font>;
+<font color="#555555">036 </font> }
+<font color="#555555">037 </font>
+<font color="#555555">038 </font> <font color="#0000AA">public</font> TestConstructors(String arg1)
+<font color="#555555">039 </font> {
+<font color="#555555">040 </font> <font color="#006699">this</font>();
+<font color="#555555">041 </font> <font color="#006699">this</font>.arg1 = arg1;
+<font color="#555555">042 </font> }
+<font color="#555555">043 </font>
+<font color="#555555">044 </font> <font color="#0000AA">public</font> TestConstructors(String arg1, String arg2)
+<font color="#555555">045 </font> {
+<font color="#555555">046 </font> <font color="#006699">this</font>();
+<font color="#555555">047 </font> <font color="#006699">this</font>.arg1 = arg1;
+<font color="#555555">048 </font> <font color="#006699">this</font>.arg2 = arg2;
+<font color="#555555">049 </font> }
+<font color="#555555">050 </font>
+<font color="#555555">051 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> print()
+<font color="#555555">052 </font> {
+<font color="#555555">053 </font> System.out.println(<font color="#0000FF">"arg1 = "</font> + arg1);
+<font color="#555555">054 </font> System.out.println(<font color="#0000FF">"arg2 = "</font> + arg2);
+<font color="#555555">055 </font> }
+<font color="#555555">056 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing4306.java"><font color="#000055" size=-1>Listing4306.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 43.6: Parametrisierte Konstruktoren mit Reflection aufrufen</i></p>
+
+<p>
+Das Programm erzeugt zunächst ein Klassenobjekt zu der Klasse
+<font color="#000077"><tt>TestConstructors</tt></font>. Anschließend
+wird ein Array mit zwei Klassenobjekten der Klasse <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+erzeugt und als Spezifikation der formalen Parameter an <a href="index_g.html#ixb102371"><font color=#000080><tt>getConstructor</tt></font></a>
+übergeben. Das zurückgegebene <a href="index_c.html#ixb102372"><font color=#000080><tt>Constructor</tt></font></a>-Objekt
+wird dann mit zwei aktuellen Argumenten »eins« und »zwei«
+vom Typ <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+ausgestattet, die an seine Methode <a href="index_n.html#ixb102334"><font color=#000080><tt>newInstance</tt></font></a>
+übergeben werden. Diese instanziert das Objekt, castet es auf
+die Klasse <font color="#000077"><tt>TestConstructors</tt></font>
+und ruft deren Methode <font color="#000077"><tt>print</tt></font>
+auf. Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+arg1 = eins
+arg2 = zwei
+</pre>
+</font>
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100271.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100273.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100275.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100279.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
