Qual é o objeto de classe (java.idioma.Classe)?

a documentação Java para Class diz:

Class os objetos são construídos automaticamente pela máquina virtual Java à medida que as classes são carregadas e pelas chamadas para o método defineClass no carregador de classe.

O que são estes objectos? Eles são os mesmos que objetos instanciados de uma classe chamando new?

também, por exemplo {[5] } Como é que tudo pode ser datilografado para superclasse {[[0]}, mesmo que eu não herde de java.lang.Class?

Author: dimo414, 2010-12-15

5 answers

Nada é datilografado para Class. Cada Object em Java pertence a um certo class. É por isso que a classe Object, que é herdada por todas as outras classes, define o método getClass().

getClass(), ou o class-literal - Foo.class devolve um objecto Class, que contém alguns meta-dados sobre a classe:

  • nome
  • pacote
  • métodos
  • Campos
  • Construtores
  • anotações
E alguns métodos úteis como a fundição e vários controlos (isAbstract(), isPrimitive(), etc). o javadoc mostra exactamente que informação pode obter sobre uma classe.

Então, por exemplo, se um método seu é dado um objeto, e você quer processá-lo no caso de ser 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 classe do objecto dado (seja qual for), e verifica se tem uma anotação dada. Muitos dos métodos em uma instância Class são chamados "operações reflexivas", ou simplesmente "reflexão". leia aqui sobre reflexão, porquê e quando é usado.

Note também que os enums e interfaces também representam um objecto Class, e têm os respectivos metadados.

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

 75
Author: Bozho, 2010-12-15 18:27:14

Um objecto de classe é uma espécie de meta-objecto que descreve a classe de um objecto. É usado principalmente com as capacidades de reflexão de Java. Você pode pensar nisso como uma" planta " da classe real. Por exemplo, tens um carro de classe como este.

public class Car {
    public String brand;
}

Você pode então construir um objeto de classe que descreve a sua classe "carro".

Class myCarClass = Class.forName("Car");
Agora podes fazer todo o tipo de perguntas sobre a tua classe de carros sobre o objecto da classe.
myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field
E assim por diante. Cada objeto java tem um método getClass () que devolve o objecto de classe que descreve a classe do objecto Java. Para que pudesses fazer algo como:
Car myCar = new Car();
Class myCarClass  = myCar.getClass();

Isto também funciona para objectos que não conhece, por exemplo, objectos que obtém do exterior:

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

Você pode alimentar este método qualquer objecto java e ele irá imprimir a classe real do objecto que lhe deu.

Ao trabalhar com Java, na maioria das vezes você não precisa se preocupar com objetos de classe. Eles têm alguns casos úteis no entanto. Por exemplo, permitem você para instanciar programaticamente objetos de uma determinada classe, que é usado muitas vezes para serialização de objetos e deserialização (por exemplo, converter objetos Java para XML e para trás, bem principalmente para trás).

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 métodos da sua classe, etc, o que é muito útil em certos casos. Então, por exemplo, se o seu método recebe entregue um objeto desconhecido e você precisa saber mais sobre ele, como se ele imita alguma interface etc, a classe classe é o seu amigo aqui.

Resumindo, a classe, o campo, o método, etc. classes que estão no java.idioma.reflectir pacote permite-lhe analisar as suas classes, métodos, campos definidos, criar novas instâncias deles, chamar métodos de todos os tipos de outras coisas e eles permitem-lhe fazer isso dinamicamente em tempo de execução.
 36
Author: Jan Thomä, 2010-12-15 18:25:24

getClass() é um método que devolve um objecto que é uma instância de java.lang.Class... não há casting envolvido. O elenco ficaria assim:

Class<?> type = (Class<?>) object;
 7
Author: ColinD, 2010-12-15 18:16:49

Também gostaria de adicionar à resposta do ColinD que o getClass irá devolver o mesmo objecto 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 a , estou a usar ==.

 4
Author: Koray Tugay, 2015-05-02 09:24:07

Um objeto de classe é uma instância de classe (java.idioma.Classe). Abaixo citação retirada do javadoc da classe deve responder à sua pergunta

A turma não tem construtor público. Em vez disso, objetos de classe são construídos automaticamente pela máquina virtual Java como classes são carregadas e por chamadas para o método defineClass no carregador de classe.
 2
Author: Pakka Techie, 2010-12-19 19:03:19