Wie kann man sehen, ob ein Objekt ein Array ist, ohne Reflektion zu verwenden?

Lesezeit: 5 Minuten

Benutzer-Avatar
Edbras

Wie kann ich in Java sehen, ob ein Objekt ein Array ist, ohne Reflektion zu verwenden? Und wie kann ich alle Elemente durchlaufen, ohne Reflektion zu verwenden?

Ich verwende Google GWT, daher darf ich keine Reflektion verwenden 🙁

Ich würde gerne die folgenden Methoden implementieren, ohne Reflexion zu verwenden:

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

Übrigens: Ich möchte JavaScript auch nicht so verwenden, dass ich es in Nicht-GWT-Umgebungen verwenden kann.

Benutzer-Avatar
Steve Kuo

Sie können verwenden Class.isArray()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

Dies funktioniert sowohl für Objekt- als auch für Primitive-Arrays.

Für toString werfen Sie einen Blick auf Arrays.toString. Sie müssen den Array-Typ überprüfen und die entsprechende aufrufen toString Methode.

  • Erwähnenswert ist, dass Sie den Array-Typ mithilfe von herausfinden können obj.getClass().getComponentType().

    – Steve Kammern

    24. Juni 2019 um 11:23 Uhr

Benutzer-Avatar
polygenelubricants

Sie können verwenden instanceof.

JLS 15.20.2 Typvergleichsoperator instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType

Zur Laufzeit wird das Ergebnis der instanceof Betreiber ist true wenn der Wert der RelationalerAusdruck ist nicht null und der Verweis könnte auf die gegossen werden Referenztyp ohne a zu erhöhen ClassCastException. Ansonsten ist das Ergebnis false.

Das heißt, Sie können Folgendes tun:

Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"        

Sie müssten prüfen, ob das Objekt ein ist instanceof boolean[], byte[], short[], char[], int[], long[], float[], double[]oder Object[]wenn Sie alle Array-Typen erkennen möchten.

Auch ein int[][] ist ein instanceof Object[]je nachdem, wie Sie mit verschachtelten Arrays umgehen möchten, kann es also kompliziert werden.

Für die toString, java.util.Arrays hat ein toString(int[]) und andere Überladungen, die Sie verwenden können. Es hat auch deepToString(Object[]) für verschachtelte Arrays.

public String toString(Object arr) {
   if (arr instanceof int[]) {
      return Arrays.toString((int[]) arr);
   } else //...
}

Es wird sich sehr wiederholen (aber sogar java.util.Arrays ist sehr repetitiv), aber so ist es in Java mit Arrays.

Siehe auch

  • Verwaltung von sich stark wiederholendem Code und Dokumentation in Java
  • Java Arrays.equals() gibt false für zweidimensionale Arrays zurück.

  • Danke, war mir nicht bewusst, dass es so einfach ist. Dachte, dass instanceof nicht direkt mit T verwendet werden könnte[] 🙁

    – Edbras

    28. April 2010 um 7:44 Uhr

  • Übrigens: Ich habe auch eine andere nette Möglichkeit bemerkt, um herauszufinden, ob etwas ein Array Class.isArray() ist (verwendet in Arrays.deepToString()).

    – Edbras

    28. April 2010 um 8:35 Uhr

  • @edbras: ja, das hat Steve Kuo unten gesagt. Meine Lösung verwendet ein reines linguistisches Konstrukt anstelle eines API-Aufrufs.

    – polygenelubricants

    28. April 2010 um 8:38 Uhr

  • Es funktioniert gut, ich verwende nur nicht instanceof, sondern getClass als Vergleich. So etwas wie: if (array.getClass == int[].class) {Arrays.toString((int[]) Array); } Danke an alle..

    – Edbras

    28. April 2010 um 11:05 Uhr

  • @edbras: So ist es java.util.Arrays geht, ja. Ich sehe, dass Sie den von mir verlinkten Code gelesen haben.

    – polygenelubricants

    28. April 2010 um 11:16 Uhr

Benutzer-Avatar
Benutzer1928596

Mit dem folgenden Code kann man auf jedes Element eines Arrays separat zugreifen:

Object o=...;
if ( o.getClass().isArray() ) {
    for(int i=0; i<Array.getLength(o); i++){
        System.out.println(Array.get(o, i));
    }
}

Beachten Sie, dass Sie nicht wissen müssen, um welche Art von Array es sich handelt, da dies für jedes Array funktioniert.

  • isArray() wurde in den Antworten, die 4 Jahre vor dieser gepostet wurden, bereits ausreichend behandelt.

    – Jason C

    17. November 2014 um 4:47 Uhr

  • Diese Antwort ist großartig, weil sie uns zeigt, wie man die Größe eines Arrays erhält und ein Element ohne Kenntnis seines Inhaltstyps abruft. Ich bin mir sicher, dass die meisten Leute noch nie einen solchen Code geschrieben haben.

    – Christoph Yang

    13. Januar 2015 um 5:40 Uhr


  • @MaartenBodewes – würde ich verwenden dieser Link zu entscheiden, was “keine Reflektion verwenden” für GWT bedeutet.

    – Stefan C

    12. November 2018 um 23:59 Uhr

Benutzer-Avatar
Stefan C

Es gibt keine Subtypisierungsbeziehung zwischen Arrays eines primitiven Typs oder zwischen einem Array eines primitiven Typs und einem Array eines Referenztyps. Sehen JLS 4.10.3.

Daher ist das Folgende als Test falsch, um festzustellen, ob obj ist ein Array jeglicher Art:

// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}

Insbesondere funktioniert es nicht, wenn obj ist ein 1-D-Array von Grundelementen. (Es funktioniert jedoch für primitive Arrays mit höheren Dimensionen, da alle Array-Typen Untertypen von sind Object. Aber das ist in diesem Fall strittig.)

Ich verwende Google GWT, daher darf ich keine Reflektion verwenden 🙁

Die beste Lösung (zum isArray Array-Teil der Frage) hängt davon ab, was als “Reflexion verwenden” gilt.

  • In GWT anrufen obj.getClass().isArray() zählt nicht als Verwendung von Reflektion1das ist also die beste Lösung.

  • Andernfalls ist der beste Weg, um herauszufinden, ob ein Objekt einen Array-Typ hat, die Verwendung einer Folge von instanceof Ausdrücke.

    public boolean isArray(final Object obj) {
        return obj instanceof Object[] || obj instanceof boolean[] ||
           obj instanceof byte[] || obj instanceof short[] ||
           obj instanceof char[] || obj instanceof int[] ||
           obj instanceof long[] || obj instanceof float[] ||
           obj instanceof double[];
    }
    
  • Sie könnten auch versuchen, mit dem Namen der Objektklasse wie folgt herumzuspielen, aber der Aufruf von obj.getClass() grenzt an Reflexion.

    public boolean isArray(final Object obj) { return obj.getClass().toString().charAt(0) == '[';
    }
    

1 – More precisely, the Class.isArray method is listed as supported by GWT in this page.

You can create a utility class to check if the class represents any Collection, Map or Array

  public static boolean isCollection(Class<?> rawPropertyType) {
        return Collection.class.isAssignableFrom(rawPropertyType) || 
               Map.class.isAssignableFrom(rawPropertyType) || 
               rawPropertyType.isArray();
 }

user avatar
Sina Madani

Simply obj instanceof Object[] (getestet auf JShell).

1310710cookie-checkWie kann man sehen, ob ein Objekt ein Array ist, ohne Reflektion zu verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy