qual é o object Class (java.lang.Class)?

A documentação do Java para a Class diz:

Class objects de Class são construídos automaticamente pela Java Virtual Machine conforme as classs são carregadas e por chamadas para o método defineClass no carregador de classs.

Quais são esses objects de Class ? Eles são os mesmos objects instanciados de uma class chamando new ?

Além disso, por exemplo, object.getClass().getName() como tudo pode ser typecasted para Class superclass, mesmo que eu não herde de java.lang.Class ?

Nada é typecasted para a Class . Todo Object em Java pertence a uma determinada class . É por isso que a class Object , que é herdada por todas as outras classs, define o método getClass() .

getClass() ou o literal de class – Foo.class retorna um object Class , que contém alguns metadados sobre a class:

  • nome
  • pacote
  • methods
  • Campos
  • construtores
  • annotations

e alguns methods úteis como fundição e várias verificações ( isAbstract() , isPrimitive() , etc). o javadoc mostra exatamente quais informações você pode obter sobre uma class.

Então, por exemplo, se um método seu receber um object, e você quiser processá-lo caso ele seja anotado com a anotação @Processable , então:

 public void process(Object obj) { if (obj.getClass().isAnnotationPresent(Processable.class)) { // process somehow; } } 

Neste exemplo, você obtém os metadados sobre a class do object dado (seja ele qual for) e verifica se possui uma determinada anotação. Muitos dos methods em uma instância de Class são chamados de “operações reflexivas” ou simplesmente “reflection”. Leia aqui sobre a reflection, por que e quando ela é usada.

Observe também que enums e interfaces também representam um object Class e possuem os respectivos metadados.

Para resumir – cada object em java tem (pertence a) uma class e tem um respectivo object Class , que contém metadados sobre ele, que é acessível em tempo de execução.

Um object Class é uma espécie de object meta que descreve a class de um object. É usado principalmente com os resources de reflection do Java. Você pode pensar nisso como um “projeto” da class real. Por exemplo, você tem uma class Carro assim:

 public class Car { public String brand; } 

Você pode então construir um object Class que descreva sua class “Car”.

 Class myCarClass = Class.forName("Car"); 

Agora você pode fazer todos os tipos de consultas em sua class Car no object Class:

 myCarClass.getName() - returns "Car" myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field 

e assim por diante. Todo object java possui um método getClass () que retorna o object Class descrevendo a class do object Java. Então você poderia fazer algo como:

 Car myCar = new Car(); Class myCarClass = myCar.getClass(); 

Isso também funciona para objects que você não conhece, por exemplo, objects que você recebe do lado de fora:

 public void tellMeWhatThisObjectsClassIs(Object obj) { System.out.println(obj.getClass().getName()); } 

Você poderia alimentar este método com qualquer object java e imprimir a class real do object que você deu a ele.

Ao trabalhar com Java, na maioria das vezes você não precisa se preocupar com objects de class. Eles têm alguns casos úteis de uso embora. Por exemplo, eles permitem que você programe programaticamente objects de uma determinada class, o que é usado com frequência para serialização e desserialização de objects (por exemplo, converter objects Java em XML e voltar, bem principalmente de volta).

 Class myCarClass = Class.forName("Car"); Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car(); 

Você também pode usá-lo para descobrir todos os campos declarados ou methods da sua class, etc., o que é muito útil em certos casos. Então, por exemplo, se o seu método recebe um object desconhecido e você precisa saber mais sobre ele, como se ele cria alguma interface, etc, a class Class é sua amiga aqui.

Portanto, para encurtar a história, as classs Class, Field, Method, etc. que estão no pacote java.lang.reflect permitem que você analise suas classs, methods, campos, crie novas instâncias, methods de chamada e todos os outros tipos de coisas. e eles permitem que você faça isso dinamicamente em tempo de execução.

getClass() é um método que retorna um object que é uma instância de java.lang.Class … não há transmissão envolvida. Casting ficaria assim:

 Class< ?> type = (Class< ?>) object; 

Eu também gostaria de adicionar à resposta de ColinD que getClass retornará o mesmo object para instâncias do mesmo tipo. Isto irá imprimir true :

  MyOtherClass foo = new MyOtherClass(); MyOtherClass bar = new MyOtherClass(); System.out.println(foo.getClass()==bar.getClass()); 

Note que não é igual , estou usando == .

Um object Class é uma instância de Class (java.lang.Class). Abaixo citação tirada de javadoc de class deve responder sua pergunta

A class não possui um construtor público. Em vez disso, os objects Class são construídos automaticamente pela Java Virtual Machine conforme as classs são carregadas e por chamadas para o método defineClass no carregador de classs.