Probleme mit Reflections und Arrays

  • Themenstarter Themenstarter OhNo
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
O

OhNo

Gast
Hi Leute, ich habe folgendes Probelm:

Code:
Class [b]A[/b]{}

Class [b]B[/b] extends [b]A[/b] 
{
     verschiedene Methoden
}

Class [b]C[/b] extends [b]A[/b] 
{
     verschiedene Methoden
}

Ich habe eine superklasse und zwei abgeleite Klassen wie oben zu sehen ist. Jetzt definiere ich in der Classe D eine Funktion. Diese Funktion bekommt als übergabeparameter einen Methodennamen und ENTWEDER ein objekt von Class B ODER Class C. Da ich dies aber erst zur Laufzeit weiss nehme ich logischer Weise die Superklasse A.

DAS PROBLEM: Ich will nun über Reflections eine Methode aufrufen die als Übergabeparameter wiederum ein Objekt von Class B oder Class C hat. Allerdings muss ich bei der invoke Methode als zweiten Parametertyp ein ARRAY VOM TYP Class B oder Class C übergeben, da ich erst zur Laufzeit weiss, ob es jetzt Class B oder C ist kann ich aber noch keins instanziieren und ein Array vom Superklassentyp funktioniert nicht.... was kann ich tun?

Code:
Class [b]D[/b]
{

public void foo(A klassenName, String methodenName)
{
      klassenName.getClass().getMethod(methodenName, new Class[] { klassenName.getClass() })
                    .invoke(klassenName.getClass(), ??? );

}

}
[/code]
 
edit: ach verguckt, B und C erben von A und nicht C von B von A,
da solltest du aber eine andere Benennung verwenden als die Buchstaben in dieser Reihenfolge 😉

also es gilt trotzdem: zur Laufzeit testen, keine Schwierigkeit?

Code:
package de.dialo.webapp.action.test;


public class Test {

    public static void main(String[] args) throws Exception {
        p("start");

        Object c1 = new String[0];
        Object c2 = new Integer[0];
        
        p("is c1 Integer[]?: "+Integer[].class.isInstance(c1));
        p("is c2 Integer[]?: "+Integer[].class.isInstance(c2));
        
        p("is c1  String[]?: "+String[].class.isInstance(c1));
        p("is c2  String[]?: "+String[].class.isInstance(c2));
        
        if (Integer[].class.isInstance(c1)) {
            Integer[] ia = (Integer[]) c1;
            doNothing(ia);
        }
        if (Integer[].class.isInstance(c2)) {
            Integer[] ia = (Integer[]) c2;
            doNothing(ia);
        }
    }
    
    public static void doNothing(Integer[] ia) {
        p("nothing done");
    }

    public static void p(Object o) {
        System.out.println(( o == null ? o : o.toString() ));
    }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben