Receio não entender completamente o que você está perguntando. Se você pudesse elaborar um pouco mais, alguém pode ser capaz de fornecer-lhe informações mais úteis
Paul Walker
28
Isso certamente parece uma pergunta real para mim. Eu estava apenas fazendo essa pergunta e me encontrei aqui após uma rápida pesquisa no Google. Acho que não deveria ter me incomodado se soubesse que minha pergunta não era real!
Doctor Jones
1
Além disso, acho que, devido ao constrangimento de uma determinada sequência de pesquisa, há pouco texto ou informação sobre essa questão. Além dos documentos da API vinculados acima, nunca vi essa notação mencionada em nenhum outro lugar (embora você a veja frequentemente usada em reflexão).
Jordanpg # 12/14
2
@ MadProgrammer, o OP, está perguntando sobre a .classsintaxe que está relacionada, incidentalmente, à .classextensão do nome do arquivo.
Jordanpg # 12/14
Respostas:
143
Quando você escreve .classapós um nome de classe, ele faz referência à classe literal -
java.lang.Classobjeto que representa informações sobre determinada classe.
Por exemplo, se sua classe é Print, então Print.classé um objeto que representa a classe Printem tempo de execução. É o mesmo objeto retornado pelo getClass()método de qualquer instância (direta) de Print.
getClass()só é útil se você tiver uma referência apontando para um objeto da classe. ClassName.classpode ser usado mesmo que a classe não tenha instâncias. Por exemplo, considere Math.class. Cada um está correto para determinadas situações.
Patricia Shanahan
Explicação brilhante. Direto ao ponto de it.Love como você identificou a distinção entre .classe.getClass().
Sevastyan Savanyuk
6
Se uma instância de um objeto estiver disponível, a maneira mais simples de obter sua Classe é chamar Object.getClass()
A .classsintaxe
Se o tipo estiver disponível, mas não houver instância, é possível obter uma Classe anexando .classao 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 errorClass c =boolean.class;// correct
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.
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 .classsintaxe 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 .classsintaxe para tipos de dados primitivos.
package test;publicclassTest{publicstaticvoid main(String[] args){//there is no instance available for class Test, so use Test.classSystem.out.println("Test.class.getName() ::: "+Test.class.getName());// Now create an instance of class Test use getClass()Test testObj =newTest();System.out.println("testObj.getClass().getName() ::: "+ testObj.getClass().getName());//For primitive typeSystem.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 .classobté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>
Sam Dufel 4/14/14
0
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
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ãoPrint.class
é um objeto que representa a classePrint
em tempo de execução. É o mesmo objeto retornado pelogetClass()
método de qualquer instância (direta) dePrint
.fonte
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
? Ele tentará descobrirclass 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:
Isso produzirá:
Esta é a classe do objeto string :)
fonte
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, considereMath.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
sintaxeSe 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.Consulte: docs.oracle.com sobre classe
fonte
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.
fonte
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.fonte
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.fonte
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: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
fonte