O método getClass(), o objeto Class e uma introdução ao Reflection - 1

"Olá, amigo!"

"Agora é hora do evento principal. Vamos nos familiarizar com a classe Class e tocar em Reflection.
Como você provavelmente já percebeu, tudo em Java é um objeto. E o que um objeto precisa? O que cada objeto tem que define do que se trata?"

"Uma aula!"

"Certo! Muito bem. Cada objeto tem uma classe. Mas voltando aos objetos... Alguns objetos contêm inteiramente uma entidade, enquanto outros simplesmente ajudam a gerenciá-la."

"Este último tipo inclui FileOutputStream e Thread . Quando você cria um objeto Thread , um novo thread não é criado. O thread é criado pela máquina virtual Java depois que o método start() é chamado. Esse objeto simplesmente ajuda a gerenciar o processo."

"O mesmo com FileOutputStream : o arquivo é armazenado em disco e o sistema operacional gerencia o armazenamento e o acesso. Mas podemos interagir com ele por meio de objetos File, mais uma vez com a ajuda da máquina virtual Java."

"Sim, eu já entendo isso."

"Então, há uma classe especial chamada Class para interagir com as classes."

"Isso não foi difícil de adivinhar."

"Sim. Cada vez que a máquina virtual Java carrega uma nova classe na memória, ela cria um objeto Class, que você pode usar para obter informações específicas sobre a classe carregada."

"Cada classe e objeto está associado a um « objeto de classe »."

Exemplo Descrição
Class clazz = Integer.class;
Obtém o objeto Class da classe Integer.
Class clazz = int.class;
Obtém o objeto Class da classe int.
Class clazz = "123".getClass();
Obtém o objeto Class de um objeto String.
Class clazz = new Object().getClass();
Obtém o objeto Class do objeto Object.

"Nossa que interessante!"

"Você se lembra que a palavra class é uma palavra-chave em Java e não pode ser usada como nome de variável?"

"Oh sim, eu sei, eu sei. Eu apenas esqueci."

"Você já usou o objeto Class em algum lugar?"

"Sim, nós o usamos quando escrevemos nossa própria implementação do método equals."

"Sim, você pode usar o método getClass() para testar se os objetos têm a mesma classe."

"E o que você pode fazer com esse objeto?"

"Bem, um monte de coisas:"

código Java Descrição
Class s = int.class;
String name = s.getName();
Obtém o nome da classe.
Class s = Class.forName("java.lang.String");
Obtém uma classe pelo nome.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Compara as classes dos objetos.

"Interessante, mas não tão legal quanto eu pensava."

"Você quer que seja legal? Também tem ReflectionReflection é super legal."

"O que é Reflexão ?"

" Reflexão é a capacidade de uma classe obter informações sobre si mesma. Java tem classes especiais:  Field e Method , que são semelhantes à classe Class para classes. Assim como os objetos Class permitem obter informações sobre uma classe, os objetos Field fornecem informações sobre um campo , e o objeto Method fornece informações sobre um método. E veja o que você pode fazer com eles:"

código Java Descrição
Class[] interfaces = List.class.getInterfaces();
Obtém uma lista de objetos Class para as interfaces da classe List
Class parent = String.class.getSuperclass();
Obtém o objeto Class da classe pai da classe String
Method[] methods = List.class.getMethods();
Obtém uma lista dos métodos da classe List
String s = String.class.newInstance();
Cria uma nova String
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Obtém o método length da classe String e o chama no String s

"Uau! Isso é muito legal!"