O que significa .class em Java?


149

O que .classsignifica em Java? Por exemplo, se eu criei uma classe chamada Print. O que Print.classretorna?



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.

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

2
Quais são algumas das coisas que podemos fazer com um objeto de classe?
26613 Kevin Kevin

7
@Kevin Consulte a documentação da API para java.lang.Class .
Patricia Shanahan

Aplicação: acesso a campos privados, por exemplo: Writer.class.getDeclaredField("writeBuffer").
Jordanpg # 12/14

2
Então, qual é o tipo de Print.class?
Zhipeng YANG

1
E como o Android lida new Intent(this, Activity.class? Ele tentará descobrir class Activitycomparando cada classe?
Zhipeng YANG

56

.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 :)


7
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 error

Class c = boolean.class;  // correct

Consulte: docs.oracle.com sobre classe


6

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.


3

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;

    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());
       }
    }

1

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.


4
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<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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.