kramann.info
© Guido Kramann

Login: Passwort:










Verwendung von Java-Reflection

javareflection.zip - die nachfolgenden Beispiele.
  • An kleinen Beispielen soll Schritt für Schritt die Benutzung von Java-Reflection beschrieben werden.

Klassenname eines Objektes herausfinden

public class Reflect1
{
    public static void main(String[] args)
    {
        Reflect1 rf = new Reflect1();

        Class klasse = rf.getClass();
        
        System.out.println("Der Klassenname dieses Objektes lautet:"+klasse.getName());
    }
}

Code 6-1: Klassenname eines Objektes herausfinden.

Der Klassenname dieses Objektes lautet:Reflect1

Code 6-2: Konsolenausgabe von Reflect1.

Alle Methoden eines Objektes herausfinden

import java.lang.reflect.Method ;

public class Reflect2
{
    public int x;

    public void setX(int x)
    {
        this.x = x;
    }

    public static void main(String[] args)
    {
        Reflect2 rf = new Reflect2();

        Class klasse = rf.getClass();
        
        Method[] methoden = klasse.getMethods();

        for(int i=0;i<methoden.length;i++)
             System.out.println(methoden[i].getName());
    }
}

Code 6-3: Alle Methoden eines Objektes herausfinden.

main
setX
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll

Code 6-4: Konsolenausgabe von Reflect2.

Eine Methode über ihren Namen aufrufen

import java.lang.reflect.Method ;

public class Reflect3
{
    public int x;

    public void setX(int x)
    {
        this.x = x;

        System.out.println("x wurde auf den Wert "+x+" gesetzt.");
    }

    public static void main(String[] args)
    {
        Reflect3 rf = new Reflect3();

        Class klasse = rf.getClass();
        
        Method[] methoden = klasse.getMethods();

        for(int i=0;i<methoden.length;i++)
        {
             System.out.println(methoden[i].getName());
 
             if( methoden[i].getName().equals("setX") )
             {
                 try
                 {
                     methoden[i].invoke(rf,42);
                 }
                 catch(Exception e)
                 {
                     System.out.println(e);
                 }
             }
        }
    }
}

Code 6-5: Eine Methode über ihren Namen aufrufen

main
setX
x wurde auf den Wert 42 gesetzt.
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll

Code 6-6: Konsolenausgabe von Reflect3.

Methode eines fremden Applets aufrufen

  • Bei dem folgenden Beispiel wird über Applet-Parameter beschrieben, wieviele Buttons in dem Objekt von Reflect4a erzeugt werden und welche Methode bei welchem anderen Applet diese aufrufen sollen.
  • Die Angaben werden in der start()-Methode analysiert und das Applet entsprechend konfiguriert.
  • Damit auch alle Applets erreichbar sind, warten alle Applets darauf, dass alle zu erwartenden Applets im Applet-Kontext erscheinen.
  • Die entsprechende Warte-Methode und auch eine, die ein Array mit allen verfügbaren Applets liefert werden als statische Methoden in AppletInitialisierung zur Verfügung gestellt.
import java.applet.Applet ;

import java.util.Enumeration ;
import java.util.ArrayList ;
import java.lang.reflect.Method ;


/**
Damit alle auf einer Seite befindlichen Applets miteinander
kommunizieren können, müssen sie einander registrieren.
Um Zugriff auf alle Objekte zu bekommen, müssen vorher aber alle
initialisiert sein.
Darauf muß gewartet werden.
Hierzu und zu weiteren notwendigen Verrichtungen gibt es hier
statische Methoden.
*/
public class AppletInitialisierung
{
    public static String[] getAppletNames(Applet applet)
    {
        Enumeration enumm = null;
        boolean ok=true;

        ArrayList<String> merker = new ArrayList<String>();

        try
        {
                    enumm = applet.getAppletContext().getApplets();
        }
        catch(Exception e)
        {
            ok=false;
        }
        if(enumm!=null && ok==true)
        {
            while(  enumm.hasMoreElements() )
            {
                Object app = enumm.nextElement();
                if(app!=null)//Hier abfangen, wenn es kein weiteres Element mehr gibt!
                    merker.add(  ((Applet)app).getName()  );
            }
        }

        if(merker==null || merker.size()==0)
            return null;

        String[] names = new String[merker.size()];

        for(int i=0;i<names.length;i++)
            names[i] = (String)merker.get(i);

        return names;
    }

    /**
    Bleibt in dieser Methode hängen,bis alle Applets ihre Initialisierungsphase
    durchlaufen haben.
    */
    public static void warteAufAlleApplets(Applet applet,String[] alleApplets)
    {
        boolean alle_da=false;

        while(alle_da==false)
        {
            String[] names = getAppletNames(applet);
            if(names!=null && names.length>0)
            {
                alle_da = true;
                for(int i=0;i<alleApplets.length;i++)
                {
                    boolean gefunden = false;
                    for(int k=0;k<names.length;k++)
                    {
                        if(names[k].equals(alleApplets[i]))
                        {
                             gefunden = true;
                             break;
                        }
                    }
                    if(gefunden==false)
                    {
                        alle_da = false;
                        break;
                    }
                }
            }

            try
            {
                Thread.sleep(100);
            }
            catch(Exception e)
            {
            }
        }        
    }

    /**
    Liefert aus dem Objekte-Kontext heraus alle auf der Seite befindlichen Applets
    als Object-Array.

TODO    VERBESSERUNG: Doppelte herauswerfen, Wartemethode unmittelbar vorher aufrufen (kombinieren)
    */
    public static Object[] holeAlleApplets(Applet applet)
    {
        Enumeration enumm = null;
        boolean ok=true;

        ArrayList<Object> merker = new ArrayList<Object>();

        try
        {
                    enumm = applet.getAppletContext().getApplets();
        }
        catch(Exception e)
        {
            ok=false;
        }
        if(enumm!=null && ok==true)
        {
            while(  enumm.hasMoreElements() )
            {
                Object app = enumm.nextElement();
                if(app!=null)//Hier abfangen, wenn es kein weiteres Element mehr gibt!
                    merker.add(  app  );
            }
        }

        if(merker==null || merker.size()==0)
            return null;

        return merker.toArray();
    }
}

Code 6-7: AppletInitialisierung: Auf alle Applets warten und Applets im Appletkontext oder deren Namen finden.

<html>
    <head>
    </head>
    <body>
        <applet code="Reflect4a.class" width="800" height="300">
            <PARAM name="NAME" value="erstesApplet">
            <PARAM name="UEBERGABE" value="grün zweitesApplet setGruen rot zweitesApplet setRot ">
            <PARAM name="APPLETNAMENSLISTE" value="erstesApplet zweitesApplet">
        </applet>        
        <br/>
        <br/>
        <applet code="Reflect4b.class" width="800" height="300">
            <PARAM name="NAME" value="zweitesApplet">
            <PARAM name="UEBERGABE" value="">
            <PARAM name="APPLETNAMENSLISTE" value="erstesApplet zweitesApplet">
        </applet>        
    </body>
</html>

Code 6-8: HTML-Datei index.html

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Button;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.lang.reflect.Method ;

public class Reflect4a extends Applet
{
    String[] data = null;
    String[] appletNamen = null;

    public void init()
    {
        setName(   getParameter("NAME") );
        data = getParameter("UEBERGABE").split(" ");
        appletNamen = getParameter("APPLETNAMENSLISTE").split(" ");
    }
   
    public void start()
    {
        setLayout(null);

        //Darauf warten, dass alle anderen Applets auch initialisiert sind.
        //Dann erst start-Methode fortsetzen:
        AppletInitialisierung.warteAufAlleApplets(this,appletNamen);

        //Alle Applets holen:
        Object[] applets = AppletInitialisierung.holeAlleApplets(this);
        for(int i=0;i<data.length/3;i++)
        {
            Button knopf = new Button(data[i*3+0]);
            //Anzusprechendes Applet und darin anzusprechnede Methode herausfinden:
            Object applet=null;
            Method methode = null;
            for(int k=0;k<applets.length;k++)
            {
                if(((Applet)applets[k]).getName().equals(data[i*3+1]))
                {
                    applet = applets[k];
                    Method[] alleMethoden = applets[k].getClass().getMethods();
                    for(int p=0;p<alleMethoden.length;p++)
                    {
                        if(alleMethoden[p].getName().equals(data[i*3+2]))
                        {
                            methode = alleMethoden[p];
                            break;
                        }
                    }
                    break;
                }
            }
            knopf.addActionListener(new KnopfLauscher(applet,methode));
            add(knopf);
            knopf.setBounds(400,10+30*i,80,24);
        }
    }

    public void paint(Graphics g)
    {
        for(int i=0;i<data.length;i++)
            g.drawString(data[i],10,10+23*i);
        for(int i=0;i<appletNamen.length;i++)
            g.drawString(appletNamen[i],150,10+23*i);
        g.drawString(getName(),250,10);

    }

    private class KnopfLauscher implements ActionListener
    {
        Object applet = null;
        Method methode = null;
        KnopfLauscher(Object applet, Method methode)
        {
            this.applet = applet;
            this.methode = methode;
        }

        public void actionPerformed(ActionEvent ee)
        {
            try
            {
                methode.invoke(applet);
            }
            catch(Exception eee)
            {
                Alert.zeige(""+eee);
            }
        }
    }
}

Code 6-9: Reflect4a - Buttons gemäß Übergabeparameter erstellen.

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;

public class Reflect4b extends Applet
{
    String[] data = null;
    String[] appletNamen = null;

    public void setRot()
    {
        setBackground(Color.RED);
    }

    public void setGruen()
    {
        setBackground(Color.GREEN);
    }

    public void init()
    {
        setName(   getParameter("NAME") );
        data = getParameter("UEBERGABE").split(" ");
        appletNamen = getParameter("APPLETNAMENSLISTE").split(" ");
    }
   
    public void start()
    {
        //Darauf warten, dass alle anderen Applets auch initialisiert sind.
        //Dann erst start-Methode fortsetzen:
        AppletInitialisierung.warteAufAlleApplets(this,appletNamen);

    }

    public void paint(Graphics g)
    {
        for(int i=0;i<data.length;i++)
            g.drawString(data[i],10,10+23*i);
        for(int i=0;i<appletNamen.length;i++)
            g.drawString(appletNamen[i],150,10+23*i);
        g.drawString(getName(),250,10);
    }
}

Code 6-10: Reflect4b - Methoden setRot und setGruen bereitstellen.

Applets in einem Internet-Browser.

Bild 6-1: Applets in einem Internet-Browser.