Java Reflection - Array initializieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Java Reflection - Array initializieren

    Ok,
    zunächst mal der Code:

    Quellcode

    1. Class _class;
    2. Class classInstance = null;
    3. Object anyObject;
    4. ... // hier wird class irgendetwas zugewiesen
    5. // Es sollen nur Arrays betrachtet werden
    6. if (_class.isArray()) {
    7. int size;
    8. if (classInstance != null) {
    9. size = 0;
    10. }
    11. else {
    12. size = ((Object[])classInstance).length;
    13. }
    14. Object[] tmpObjectArray;
    15. tmpObjectArray = (Object[])(((Class<Object[]>)_class).newInstance()[size+1]);
    16. for (int j = 0; j < size; j++) {
    17. tmpObjectArray[j] = ((Object[])classInstance)[j];
    18. }
    19. tmpObjectArray[size] = myMethod(...);
    20. classInstance = tmpObjectArray;
    21. }
    Alles anzeigen


    Im Code soll eine Instanz von einem Array erzeugt werden.
    An der Stelle ((Class<Object[]>)_class) in Zeile 17 kommt eine Warnung, mit der ich nichts anfangen kann:
    Type safety: The cast from Class to Class<Object[]> is actually checking against the erased type Class
    Was hat diese zu bedeuten? Stechen sonstige Fehler im Code ins Auge?

    PS:
    Es muss an dieser Stelle ein Array sein (Die Gründe sind jetzt zu verwirrend um sie zu erklären). Listen, Sets, etc. gehen nicht.
  • Die Warnung weißt nur darauf hin. Kannst du mit einem
    @SuppressWarnings ("unchecked")
    ignorieren.

    Warum verwendest du nicht System.arrayCopy?

    Quellcode

    1. // create initial dummy object
    2. Object [] x1 = new Object [5];
    3. for (int i = 0; i < x1.length; ++i)
    4. x1[i] = Integer.valueOf (i * 3);
    5. Object aSrc = x1;


    Jetzt habe ich ein Object aSrc und weiß nicht, dass es ein Array ist
    -> so gehts auch:

    Quellcode

    1. // now assume we have only "aSrc" -> append an item
    2. assert aSrc.getClass ().isArray ();
    3. Object [] aSrcArray = (Object []) aSrc;
    4. Object [] aDstArray = new Object [aSrcArray.length + 1];
    5. System.arraycopy (aSrcArray, 0, aDstArray, 0, aSrcArray.length);
    6. aDstArray[aSrcArray.length] = meineMethode (...);
    There's no place like 127.0.0.1
  • "phax" schrieb:


    Warum verwendest du nicht System.arrayCopy?


    Bei deinem Beispiel unten habe ich die Befürchtung, dass der Typ des Arrays nicht mitkopiert wird. Ich kann ja verschiedene Arrays haben z.B. String[] oder Integer[]. Da ich nicht weiß, welchen Typ die Arrays haben (Prüfen ist zwecklos, die Menge möglicher Typen ist potentiell unendlich), muss ich Object[] nehmen. Will ich die Größe des Arrays einfach um eins erhöhen, dann darf ich nicht einfach ein Array vom Typ Object initiallisieren. Sollte ich das an dieser Stelle anders machen, dann müsste eigentlich auch System.arrayCopy funktionieren.

    "phax" schrieb:


    Jetzt habe ich ein Object aSrc und weiß nicht, dass es ein Array ist
    -> so gehts auch:

    Quellcode

    1. // now assume we have only "aSrc" -> append an item
    2. assert aSrc.getClass ().isArray ();
    3. Object [] aSrcArray = (Object []) aSrc;
    4. Object [] aDstArray = new Object [aSrcArray.length + 1];
    5. System.arraycopy (aSrcArray, 0, aDstArray, 0, aSrcArray.length);
    6. aDstArray[aSrcArray.length] = meineMethode (...);



    aSrc und damit auch aSrcArray habe ich nicht. Ich habe nur ein Object vom Typ Class und das soll initialisiert werden, wenn es sich um ein Array handelt. (Wenn das eine Objekt ein Array ist, nicht, wenn ich ein Array aus Objekten habe (geht garnicht))