O que .class
significa em Java? Por exemplo, se eu criei uma classe chamada Print
. O que Print.class
retorna?
.class
sintaxe que está relacionada, incidentalmente, à .class
extensão do nome do arquivo.
O que .class
significa em Java? Por exemplo, se eu criei uma classe chamada Print
. O que Print.class
retorna?
.class
sintaxe que está relacionada, incidentalmente, à .class
extensão do nome do arquivo.
Respostas:
Quando você escreve .class
após um nome de classe, ele faz referência à classe literal -
java.lang.Class
objeto que representa informações sobre determinada classe.
Por exemplo, se sua classe é Print
, então Print.class
é um objeto que representa a classe Print
em tempo de execução. É o mesmo objeto retornado pelo getClass()
método de qualquer instância (direta) de 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
? Ele tentará descobrir class Activity
comparando cada classe?
.class
é usado quando não há uma instância da classe disponível.
.getClass()
é usado quando há uma instância da classe disponível.
object.getClass()
retorna a classe do objeto especificado.
Por exemplo:
String string = "hello";
System.out.println(string.getClass().toString());
Isso produzirá:
class java.lang.String
Esta é a classe do objeto string :)
getClass()
só é útil se você tiver uma referência apontando para um objeto da classe. ClassName.class
pode ser usado mesmo que a classe não tenha instâncias. Por exemplo, considere Math.class
. Cada um está correto para determinadas situações.
.class
e.getClass().
Se uma instância de um objeto estiver disponível, a maneira mais simples de obter sua Classe é chamar Object.getClass()
A .class
sintaxe
Se o tipo estiver disponível, mas não houver instância, é possível obter uma Classe anexando .class
ao nome do tipo. Essa também é a maneira mais fácil de obter a classe para um tipo primitivo.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Consulte: docs.oracle.com sobre classe
Apenas para esclarecer, esse método '.class' não se refere ao arquivo de bytecode que você vê após compilar o código java, nem uma confusão entre os conceitos de Class vs. Object na teoria de OOP.
Este método '.class' é usado em Java para o código Reflection. Geralmente, você pode coletar metadados para sua classe, como o nome completo da classe, lista de constantes, lista de campos públicos, etc.
Verifique estes links (já mencionados acima) para obter todos os detalhes:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
Normalmente você não planeja usar o Reflection imediatamente quando começar a construir seu projeto. É algo que você sabe que precisa depois de tentar gerenciar o código que já está funcionando. Muitas vezes você precisa gerenciar várias instâncias do seu programa. Talvez você queira identificar cada 'clone' específico para determinar se algo já está definido, ou contar o número de funções, ou simplesmente registrar os detalhes de uma instância específica da sua classe.
Se não houver uma instância disponível, a .class
sintaxe será usada para obter o objeto Class correspondente para uma classe; caso contrário, você poderá usar o método getClass () para obter o objeto Class. Como não há instância de tipo de dados primitivo, precisamos usar a .class
sintaxe para tipos de dados primitivos.
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());
}
}
Eu acho que a chave aqui é entender a diferença entre uma classe e um objeto. Um objeto é uma instância de uma classe. Mas em uma linguagem totalmente orientada a objetos, uma classe também é um objeto . Portanto, chamar .class
obtém a referência ao objeto Class dessa classe, que pode ser manipulado.
in a fully object-oriented language, a Class is also an Object
? <citation needed>
Um literal de classe é uma expressão que consiste no nome de uma classe, interface, matriz ou tipo primitivo ou no vazio do pseudo-tipo, seguido por um '.' e a classe de token. Uma das mudanças no JDK 5.0 é que a classe java.lang.Class é genérica java.lang.Class Class<T>
, portanto:
Class<Print> p = Print.class;
Referências aqui:
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