Reflection

Status
Nicht offen für weitere Antworten.

max5432

Aktives Mitglied
Ich habe folgenden Aufruf:

Java:
public class MyClass
{
    public MyClass()
    {
        MyHandler.add(MyClass.class);
    }
}

Meine Frage ist: Wie soll die Methode add in der Klasse MyHandler aussehen (abgesehen davon, dass es sich um eine Klassenmethode handelt)?

Java:
public class MyHandler
{
    private MyClass obj = null; 

// ... 

public static void add(Class<MyClass> myClass)
{
    // Ist 'myClass' ein Objekt (meines Erachtens ist es)? 
    // Falls ja, wie kann ich es in MyClass casten? 

    obj = (MyClass)myClass; // funktioniert nicht!

    // ...
}

Danke.
 
S

SlaterB

Gast
myClass ist ein Objekt vom Typ Class
myClass kann kein Objekt von MyClass sein

so wie String.class nie selber ein String sein kann
 

max5432

Aktives Mitglied
myClass ist ein Objekt vom Typ Class
myClass kann kein Objekt von MyClass sein

so wie String.class nie selber ein String sein kann

Heisst, ich muss das Objekt erzeugen:

Java:
MyClass obj = (MyClass)Class.forName(myClass.getName()).newInstance();

Natürlich mit passender Ausnahmebehandlung. Stimmt dies?
 

max5432

Aktives Mitglied
Nun noch das Folgende:

Ich möchte in einer Methode eine Andere Methode, die sich in einer noch nicht implementierten Klasse befinden wird, aufrufen. Die noch nicht implementierte Klasse sei GhostClass und die aufzurufende Metode sei public void doSomething() . Ich habe dies wie folgt gemacht:
Java:
Class.forName("GhostClass")
                    .newInstance().getClass().getMethod("doSomething").invoke(
                            Class.forName(
                                    "GhostClass")
                                    .newInstance(), (Object[]) null);

Der Code ist kompilierbar, jedoch wird bei einem Versuch, den Code auszuführen, die Ausnahme geworfen. Wenn die Klasse zur Verfügung steht, klappt alles bestens. Das war zu erwarten und ist auch so gewünscht.

Nun, meine Frage: Kann man dies auch anders (evtl. einfacher) machen?
 
S

SlaterB

Gast
> jedoch wird bei einem Versuch, den Code auszuführen, die Ausnahme geworfen. Wenn die Klasse zur Verfügung steht, klappt alles bestens.

die Exception kommt, wenn die Klasse fehlt? ja das ist doch ideal, was stellst du dir stattdessen vor,
soll der Code schweigend nix tun?

> Kann man dies auch anders (evtl. einfacher) machen?

außer Reflection gibts nicht viel anderes, der Code kürzer lautet:
Java:
Class c = Class.forName("GhostClass");
Object o = c.newInstance();
c.getMethod("doSomething").invoke(o, (Object[])null);
ein Interface könnte noch helfen:
Java:
Class c = Class.forName("GhostClass");
Doer d = (Doer)c.newInstance();
d.doSomething();


interface Doer
{
    public void doSomething();
}
dann muss GhostClass das dir bereits bekannte Interface implementieren,
etwas mehr Abhängigkeit für etwas gesparte Arbeit
 

max5432

Aktives Mitglied
die Exception kommt, wenn die Klasse fehlt? ja das ist doch ideal, was stellst du dir stattdessen vor,
soll der Code schweigend nix tun?

Nein. Ich habe schon geschrieben, dass dieses Verhalten erwartet und gar gewünscht war.

außer Reflection gibts nicht viel anderes, der Code kürzer lautet:
Java:
Class c = Class.forName("GhostClass");
Object o = c.newInstance();
c.getMethod("doSomething").invoke(o, (Object[])null);

In einem solchen Fall bekomme ich Warnungen (type safety bzw. Class<T> should be parameterized), was ich unschön finde.

Die Lösung mit Interface wäre an sich klar.

Vielen Dank.
 
S

SlaterB

Gast
> In einem solchen Fall bekomme ich Warnungen (type safety bzw. Class<T> should be parameterized), was ich unschön finde.

Class<? extends Object> c = ..
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
S reflection und felder Java Basics - Anfänger-Themen 12
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
U Reflection Benutzung Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 6
B Reflection Java Basics - Anfänger-Themen 8
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
X reflection api Java Basics - Anfänger-Themen 5
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
lumo java reflection Java Basics - Anfänger-Themen 7
J Reflection Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 3
P Reflection - Class Not Found Exception Java Basics - Anfänger-Themen 3
A Frage zu Reflection Java Basics - Anfänger-Themen 8
A abgeleitete Klassen mit Reflection holen Java Basics - Anfänger-Themen 2
W Problem bezüglich reflection Java Basics - Anfänger-Themen 11
S verschiede constructoren über reflection Java Basics - Anfänger-Themen 3
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
JFeel-x Frage zu reflection Java Basics - Anfänger-Themen 12
J Reflection Basic Java Basics - Anfänger-Themen 26
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
T von Reflection zum Thread? Java Basics - Anfänger-Themen 5
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
L Reflection-fehlermeldung Java Basics - Anfänger-Themen 12
E Klassenaufrufe dynamisch mit Reflection Java Basics - Anfänger-Themen 4
S wer oder was ist reflection? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben