Run-Time Type Identification (RTTI) é um mecanismo muito útil em Java que mantém informações relacionadas à classe quando Java está em execução.
O polimorfismo é implementado com base no RTTI. As funções do RTTI são implementadas principalmente pela classe Class.
Classe classe
Classe classe é "classe de classes" (classe de classes). Se uma classe é uma abstração e uma coleção de objetos, então a classe Class é uma abstração e uma coleção de classes.
Cada objeto Class representa outra classe. Por exemplo, no programa a seguir, o objeto c1 da classe Class representa a classe Human e c2 representa a classe Woman.
Copie o código do código da seguinte forma:
Teste de classe pública
{
público estático void principal(String[] args)
{
Humano aPerson = new Humano();
Classe c1 = aPerson.getClass();
System.out.println(c1.getName());
Humano outraPessoa = new Mulher();
Classe c2 = outraPerson.getClass();
System.out.println(c2.getName());
}
}
classeHumano
{
/**
*acessador
*/
público int getHeight()
{
retorne esta altura;
}
/**
* mutador
*/
public void growHeight(int h)
{
esta.altura = esta.altura + h;
}
altura interna privada;
}
classe Mulher estende Humano
{
/**
* novo método
*/
público Humano giveBirth()
{
System.out.println("Dar à luz");
return (novo Humano());
}
}
Quando chamamos o método getClass() do objeto, obtemos uma referência ao objeto Class correspondente.
Em c2, mesmo se convertermos a referência do objeto Women para a referência do objeto Human, o objeto Class apontado pelo objeto ainda será Woman.
Cada objeto em Java possui um objeto Class correspondente. Portanto, podemos saber a qualquer momento a classe à qual um objeto "realmente" pertence através do objeto Class. Não importa qual conversão de tipo realizamos na referência, o objeto Class correspondente ao próprio objeto é o mesmo. Quando chamamos um método através de uma referência, Java sempre pode encontrar o método definido na classe Class correta e executar o código na classe Class. Devido à existência de objetos Class, Java não se perderá devido ao upcasting de tipo. Este é o princípio do polimorfismo.
getClass: Quem sou eu?
Além do método getClass(), temos outras maneiras de chamar objetos da classe Class.
Copie o código do código da seguinte forma:
Teste de classe pública
{
público estático void principal(String[] args)
{
Classe c3 = Class.forName("Humano");
System.out.println(c1.getName());
Classe c4 = Mulher.classe
System.out.println(c2.getName());
}
}
Existem duas maneiras mostradas acima:
1. O método forName() recebe como parâmetro uma string, que é o nome da classe. Isso retornará o objeto Class correspondente.
2. O método Woman.class chama diretamente o membro da classe. Isso retornará o objeto Class correspondente.
Método de classe
O objeto Class registra as informações da classe correspondente, como o nome da classe, o pacote no qual a classe está localizada, etc. Podemos chamar o método correspondente, como:
Copie o código do código da seguinte forma:
getName() retorna o nome da classe
getPackage() retorna o pacote onde a classe está localizada
Você pode usar o método newInstance() do objeto Class para criar objetos da classe correspondente, como:
Copie o código do código da seguinte forma:
Humano newPerson = c1.newInstance();
newInstance() chama o método de construção padrão sem parâmetros.
Podemos obter os membros da definição de classe:
Copie o código do código da seguinte forma:
getFields() retorna todos os membros de dados públicos
getMethods() retorna todos os métodos públicos
Classes de análise de reflexão podem ser usadas posteriormente. Não há mais detalhes aqui.
Para mais métodos da classe Class, verifique a documentação oficial:
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html
Carregamento de classe de classe
Quando Java cria um objeto de uma determinada classe, como um objeto de classe Humano, Java verifica se existe um objeto de classe correspondente na memória.
Se não houver nenhum objeto Class correspondente na memória, Java procurará a definição da classe Human no arquivo .class e carregará o objeto Class da classe Human.
Depois que o objeto Classe for carregado com sucesso, a criação e as operações relacionadas de outros objetos Humanos farão referência ao objeto Classe.