Wat betekent .class in Java?

Wat betekent .classin Java? Als ik bijvoorbeeld een klasse heb gemaakt met de naam Print. Wat levert Print.classop?


Antwoord 1, autoriteit 100%

Als je .classachter een klassenaam schrijft, verwijst het naar de letterlijke klasse –
java.lang.Classobject dat informatie overgegeven klasse vertegenwoordigt.

Als uw klasse bijvoorbeeld Printis, dan is Print.classeen object dat de klasse Printvertegenwoordigt tijdens runtime. Het is hetzelfde object dat wordt geretourneerd door de methode getClass()van een (direct) exemplaar van Print.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());

Antwoord 2, autoriteit 37%

.classwordt gebruikt als er geen instantie van de klasse beschikbaar is.

.getClass()wordt gebruikt wanneer er een instantie van de klasse beschikbaar is.

Object.getClass()geeft de klasse van het gegeven object terug.

Bijvoorbeeld:

String string = "hello";
System.out.println(string.getClass().toString());

Dit levert het volgende op:

class java.lang.String

Dit is de klasse van het string-object 🙂


Antwoord 3, autoriteit 5%

Voor alle duidelijkheid: deze ‘.class’-methode verwijst niet naar het bytecode-bestand dat je ziet na het compileren van Java-code, noch naar een verwarring tussen de concepten Klasse versus Object in de OOP-theorie.

Deze ‘.class’-methode wordt in Java gebruikt voor code Reflection. Over het algemeen kunt u metagegevens voor uw klas verzamelen, zoals de volledige gekwalificeerde klasnaam, lijst met constanten, lijst met openbare velden, enz.

Bekijk deze links (reeds hierboven genoemd) voor alle details:
https://docs.oracle.com/javase/tutorial/reflect/class /classNew.html
https://docs.oracle.com/javase/8 /docs/api/java/lang/Class.html

Normaal gesproken ben je niet van plan om Reflection meteen te gebruiken wanneer je begint met het bouwen van je project. Het is iets waarvan je weet dat je het nodig hebt nadat je geprobeerd hebt om reeds werkende code te beheren. Vaak hebt u het nodig om meerdere instanties van uw programma te beheren. Misschien wil je elke specifieke ‘kloon’ identificeren om te bepalen of iets al is gedefinieerd, of het aantal functies tellen, of gewoon de details van een bepaalde instantie van je klasse loggen.


Antwoord 4, autoriteit 4%

Als er een instantie van een object beschikbaar is, is de eenvoudigste manier om zijn klasse te verkrijgen het aanroepen van Object.getClass()

De .class-syntaxis

Als het type beschikbaar is, maar er is geen instantie, dan is het mogelijk om een Class te verkrijgen door .classtoe te voegen aan de naam van het type. Dit is ook de gemakkelijkste manier om de klasse voor een primitief type te verkrijgen.

boolean b;
Class c = b.getClass();   // compile-time error
Class c = boolean.class;  // correct

Zie: docs.oracle.com over klasse


Antwoord 5, autoriteit 2%

Als er geen instantie beschikbaar is, wordt de syntaxis .classgebruikt om het corresponderende Class-object voor een klasse op te halen, anders kunt u de getClass()-methode gebruiken om het Class-object op te halen. Aangezien er geen instantie is van een primitief gegevenstype, moeten we de syntaxis .classgebruiken voor primitieve gegevenstypen.

   package test;
    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());
          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());
          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }

Antwoord 6

Ik denk dat de sleutel hier het verschil tussen een klasse en een object is. Een object is een instantie van een klasse. Maar in een volledig objectgeoriënteerde taal is een Klasse ook een Object. Dus het aanroepen van .classkrijgt de verwijzing naar het Class-object van die Class, die vervolgens kan worden gemanipuleerd.


Antwoord 7

Een letterlijke klasse is een uitdrukking die bestaat uit de naam van een klasse, interface, array of primitief type, of het pseudo-type void, gevolgd door een ‘.’ en de tokenklasse.
Een van de veranderingen in de JDK 5.0 is dat de klasse java.lang.Class een soortnaam is, java.lang.Class Class<T>, dus:

Class<Print> p = Print.class;

Referenties hier:

https://docs.oracle.com/ JavaSE / 7 / docs / api / java / lang / Class.html

http://docs.oracle.com/javase/tutorial/ extra / generics / literals.html

http: // docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2


Antwoord 8

toevoegen aan de bovenstaande antwoorden:

Stel je hebt een een klasse met de naam “myPackage.MyClass”. Aannemende dat in classpath de volgende uitspraken equivalent.

//checking class name using string comparison, only Runtime check possible
if(myInstance.getClass().getName().equals(Class.forName("myPackage.MyClass")).getName()){}
//checking actual Class object for equality, only Runtime check possible
if(myInstance.getClass().getName() == Class.forName("myPackage.MyClass"))){}
//checking actual Class object for equality, but compile time validation
//will ensure MyClass is in classpath. Hence this approach is better (according to fail-fast paradigm)
if(myInstance.getClass() == MyClass.class){}

Ook de volgende zijn ook equivalente.

Class<?> myClassObject = MyClass.class; //compile time check
Class<?> myClassObject = Class.forname("myPackage.MyClass"); //only runtime check

Als JVM een type laadt, zal een klasseobject dat dat type vertegenwoordigt aanwezig zijn in JVM. we kunnen de metadata met betrekking tot het type krijgen van dat klasseobject dat veel wordt gebruikt in het reflectiepakket. MyClass.class is een verkorte methode die feitelijk verwijst naar het Class-object dat MyClass vertegenwoordigt.

Als addendum wat informatie over Class<?> referentie die handig is om mee te lezen, aangezien ze meestal samen worden gebruikt.

Klasse<?> referentietype kan elk Class-object bevatten dat elk type vertegenwoordigt.

Dit werkt op een vergelijkbare manier als de Class<?> referentie is ook in methode argument.

Houd er rekening mee dat de klasse “Klasse” geen openbare constructor heeft. U kunt dus geen “Klasse”-instanties instantiëren met de “nieuwe” operator.

Other episodes