Cosa .class
significa in Java? Ad esempio, se ho creato una classe chiamata Print
. Cosa Print.class
ritorna?
.class
sintassi che è solo incidentalmente correlata .class
all'estensione del nome file.
Cosa .class
significa in Java? Ad esempio, se ho creato una classe chiamata Print
. Cosa Print.class
ritorna?
.class
sintassi che è solo incidentalmente correlata .class
all'estensione del nome file.
Risposte:
Quando scrivi .class
dopo il nome di una classe, fa riferimento al letterale della classe -
java.lang.Class
oggetto che rappresenta le informazioni su una determinata classe.
Ad esempio, se la tua classe è Print
, allora Print.class
è un oggetto che rappresenta la classe Print
in fase di esecuzione. È lo stesso oggetto che viene restituito dal getClass()
metodo di qualsiasi istanza (diretta) di Print
.
Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Writer.class.getDeclaredField("writeBuffer")
.
Print.class
?
new Intent(this, Activity.class
? Proverà a scoprirlo class Activity
confrontando ogni classe?
.class
viene utilizzato quando non è disponibile un'istanza della classe.
.getClass()
viene utilizzato quando è disponibile un'istanza della classe.
object.getClass()
restituisce la classe dell'oggetto indicato.
Per esempio:
String string = "hello";
System.out.println(string.getClass().toString());
Questo produrrà:
class java.lang.String
Questa è la classe dell'oggetto stringa :)
getClass()
è utile solo se hai un riferimento che punta a un oggetto della classe. ClassName.class
può essere usato anche se la classe non ha istanze. Ad esempio, considera Math.class
. Ognuno è corretto per determinate situazioni.
.class
e.getClass().
Se è disponibile un'istanza di un oggetto, il modo più semplice per ottenere la sua classe è invocare Object.getClass()
La .class
sintassi
Se il tipo è disponibile ma non esiste un'istanza, è possibile ottenere una classe aggiungendo .class
il nome del tipo. Questo è anche il modo più semplice per ottenere la classe per un tipo primitivo.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Giusto per chiarire, questo metodo '.class' non si riferisce al file bytecode che vedi dopo aver compilato il codice java né una confusione tra i concetti di Class vs. Object nella teoria OOP.
Questo metodo '.class' è usato in Java per il codice Reflection. Generalmente puoi raccogliere metadati per la tua classe come il nome completo della classe qualificata, l'elenco delle costanti, l'elenco dei campi pubblici, ecc. Ecc.
Controlla questi collegamenti (già menzionati sopra) per ottenere tutti i dettagli:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
Normalmente non hai intenzione di usare subito Reflection quando inizi a costruire il tuo progetto. È qualcosa che sai di aver bisogno dopo aver provato a gestire un codice già funzionante. Molte volte ne hai bisogno per gestire più istanze del tuo programma. Forse vuoi identificare ogni particolare 'clone' per determinare se qualcosa è già definito, o contare il numero di funzioni, o semplicemente semplicemente registrare i dettagli di una particolare istanza della tua classe.
Se non è disponibile alcuna istanza, .class
viene utilizzata la sintassi per ottenere l'oggetto Class corrispondente per una classe, altrimenti è possibile utilizzare il metodo getClass () per ottenere l'oggetto Class. Poiché non esiste un'istanza del tipo di dati primitivo, dobbiamo usare la .class
sintassi per i tipi di dati primitivi.
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());
}
}
Penso che la chiave qui sia capire la differenza tra una Classe e un Oggetto. Un oggetto è un'istanza di una classe. Ma in un linguaggio completamente orientato agli oggetti, una classe è anche un oggetto . Quindi la chiamata .class
ottiene il riferimento all'oggetto Class di quella classe, che può quindi essere manipolata.
in a fully object-oriented language, a Class is also an Object
? <citazione necessaria>
Un letterale di classe è un'espressione consistente nel nome di una classe, interfaccia, matrice o tipo primitivo o nel vuoto pseudo-tipo, seguito da un '.' e la classe token. Una delle modifiche in JDK 5.0 è che la classe java.lang.Class è generica java.lang.Class Class<T>
, quindi:
Class<Print> p = Print.class;
Riferimenti qui:
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