Hoe de klasse van een object bepalen?

Als klasse Ben klasse Cklasse Auitbreiden en ik heb een object van het type Bof C, hoe kan ik bepalen van welk type het een instantie is?


Antwoord 1, autoriteit 100%

if (obj instanceof C) {
//your code
}

Antwoord 2, autoriteit 46%

Gebruik Object.getClass (). Het geeft het runtime-type van het object terug.


Antwoord 3, autoriteit 22%

Er werden meerdere juiste antwoorden gegeven, maar er zijn nog meer methoden: Class.isAssignableFrom()en gewoon proberen het object te casten (wat een ClassCastExceptionkan opleveren).

Mogelijke manieren samengevat

Laten we de mogelijke manieren samenvatten om te testen of een object objeen instantie van het type Cis:

// Method #1
if (obj instanceof C)
    ;
// Method #2
if (C.class.isInstance(obj))
    ;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;
// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

Verschillen in verwerking van null

Er is echter een verschil in de afhandeling van null:

  • In de eerste 2 methoden evalueren expressies tot falseals objnullis (nullis geen instantie van alles).
  • De derde methode zou natuurlijk een NullPointerExceptionopleveren.
  • De vierde en vijfde methode accepteren daarentegen nullomdat nullnaar elk type kan worden gecast!

Om te onthouden: nullis nieteen instantie van welk type dan ook, maar het kan naar elk type worden gecast.

Opmerkingen

  • Class.getName()mag niet worden gebruikt om een ​​“is-instance-of”-test uit te voeren, omdat het object niet van het type Cmaar een subklasse ervan, het kan een geheel andere naam en pakket hebben (daarom zullen klassenamen uiteraard niet overeenkomen), maar het is nog steeds van het type C.
  • Om dezelfde reden van overerving is Class.isAssignableFrom()niet symmetrisch:
    obj.getClass().isAssignableFrom(C.class)zou falseretourneren als het type objeen subklasse is van C.

Antwoord 4, autoriteit 4%

U kunt gebruiken:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

HTH. Maar ik denk dat het meestal geen goede gewoonte is om dat te gebruiken voor controlestroom of iets dergelijks…


Antwoord 5, autoriteit 3%

Elk gebruik van een van de voorgestelde methoden wordt beschouwd als een codegeur die is gebaseerd op een slecht OO-ontwerp.

Als je ontwerp goed is, zou je niet moeten merken dat je getClass()of instanceofhoeft te gebruiken.

Elk van de voorgestelde methoden is voldoende, maar het is iets om in gedachten te houden, qua ontwerp.


Antwoord 6, autoriteit 2%

In dit geval kunnen we reflectie gebruiken

objectName.getClass().getName();

Voorbeeld:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String name = request.getClass().getName();
}

In dit geval krijgt u de naam van de klasse die door het object wordt doorgegeven aan de interface-referentievariabele HttpServletRequest.


Antwoord 7, autoriteit 2%

Er is ook een .isInstancemethode op de “Class” klasse. als je de klasse van een object via myBanana.getClass()krijgt, kun je zien of je object myAppleeen instantie is van dezelfde klasse als myBananavia

myBanana.getClass().isInstance(myApple)

Antwoord 8

controleren met isinstance()zou niet voldoende zijn als je het tijdens runtime wilt weten.
gebruik:

if(someObject.getClass().equals(C.class){
    // do something
}

Antwoord 9

Ik heb Java 8-generieke middelen gebruikt om te achterhalen wat de objectinstantie is tijdens runtime in plaats van switch-case te moeten gebruiken

public <T> void print(T data) {
    System.out.println(data.getClass().getName()+" => The data is " + data);
}

geef elk type gegevens door en de methode zal het type gegevens afdrukken dat u hebt doorgegeven tijdens het aanroepen ervan. bijv.

   String str = "Hello World";
    int number = 10;
    double decimal = 10.0;
    float f = 10F;
    long l = 10L;
    List list = new ArrayList();
    print(str);
    print(number);
    print(decimal);
    print(f);
    print(l);
    print(list);

Hier volgt de uitvoer

java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []

Antwoord 10

Ik gebruik de blaasfunctie in mijn GeneralUtils-klasse, controleer of dit nuttig kan zijn

   public String getFieldType(Object o) {
    if (o == null) {
        return "Unable to identify the class name";
    }
    return o.getClass().getName();
}

Antwoord 11

U kunt getSimpleName()gebruiken.

Stel dat we een object hebben: Hond d = new Dog(),

Het onderstaande statement kunnen we gebruiken om de klassenaam te krijgen: Dog. Bijv.:

d.getClass().getSimpleName();// return String ‘Hond’.

PS: d.getClass() geeft je de volledige naam van je object.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

9 − eight =

Other episodes