Recuperando instâncias de classe

My name is Lucas. I'm a journalist and software developer who can take photos, print zines and make videos, that's no joke. 📸📰🎬💻🕺😅
O java.lang.Class `Reflection` ocupa um lugar central no pacote de reflexão. Ele representa uma estrutura de classes e interfaces, agregando informações sobre construtores, campos, métodos, superclasses, interfaces e assim por diante.
Em outras palavras, se você tiver uma instância de uma classe de um tipo específico, poderá obter todas as informações sobre esse tipo. É por isso que o java.lang.Classé tão importante. Existem várias maneiras de obter um objeto que representa uma java.lang.Class dependendo se o código tem acesso a uma instância da classe, ao nome da classe, ao tipo ou a uma Class existente. Vamos analisá-las mais detalhadamente!
A sintaxe .class
Para recuperar a instância de uma Class de um determinado tipo, podemos usar construção .class:
Class stringClass = String.class;
O prefixo .class é simplesmente adicionado ao nome do tipo. Essa forma de obter um Class objeto é útil quando não temos nenhuma instância da classe disponível.
Esta também é a maneira mais fácil de obter o valor Class para um tipo primitivo e até mesmo para void:
Class intClass = int.class;
Class voidClass = void.class;
Recuperar a classe de uma instância de objeto
A classe T Object, a classe base para qualquer tipo de referência, possui um método getClass. Para obter a classe Class de uma determinada instância, basta chamar esse método:
Class instanceClass = "abc".getClass();
Não se esqueça que isso só funciona para tipos de referência, já que eles herdam de Object! Para tipos primitivos, talvez seja melhor usar outros métodos.
Recuperar classe com um determinado nome
Se tivermos acesso a um nome de tipo totalmente qualificado, podemos obter o tipo correspondente Class usando o método estático Class.forName. Lembre-se de que esse método não pode ser usado para tipos primitivos!
Class forName = Class.forName("java.lang.String");
Este método também pode ser usado para recuperar objetos Class em array. Nesse caso, o nome consiste no nome do tipo de elemento precedido por um ou mais caracteres [ representando a profundidade do aninhamento do array. Os tipos de elemento são codificados da seguinte forma:
booleano – Z
byte – B
caractere – C
classe ou interface – L nome da classe;
duplo D
flutuar – F
int – I
longo – J
shorts
Class floatArrayClass = Class.forName("[F");
Class objectArrayClass = Class.forName("[[Ljava.lang.Object;");
Class scannerArrayClass = Class.forName("[Ljava.util.Scanner;");Explain code
A variável floatArrayClassconterá o Classvalor correspondente a um array unidimensional de tipo primitivo float (o mesmo que float[].class). A variável objectArrayClass, por sua vez, conterá o Class valor correspondente a um array bidimensional de Object. Observe que deve haver um ponto e vírgula ;após qualquer array de objetos.
Métodos que retornam classes
Além dos métodos que descrevemos acima, podemos usar algumas APIs de Reflection para obter classes. No entanto, você deve ter em mente que elas só podem ser usadas se uma classe Class já tiver sido obtida.
Aqui estão alguns exemplos:
// Returns the super class for the given class
String.class.getSuperclass();
// Returns all the public classes, interfaces, and enums that are members of the class
String.class.getClasses();
// Returns all of the classes, interfaces, and enums that are explicitly declared in this class.
String.class.getDeclaredClasses();
Como obter a classe pelo nome
Já abordamos os dois métodos para obter uma classe pelo nome. Vamos resumir as vantagens e desvantagens de cada um.
A primeira maneira é obter uma classe diretamente, por exemplo String.class. Parece simples, mas significa que temos conhecimento da classe no momento da compilação.
A segunda maneira é usando o método forNamede Class, por exemplo Class.forName("java.lang.String"). Este método funciona em tempo de execução e também pode ser usado quando o nome da classe de destino é resolvido dinamicamente, por exemplo, obtido de uma configuração.
Conclusão
A java.lang.Class agrega todas as informações que descrevem um determinado tipo. Por isso, é importante saber como obter uma instância da classe. Se o nome da classe for conhecido, existem duas maneiras de obter uma instância java.lang.Class: chamando o método ClassName.class diretamente ou obtendo-a Class.forName("package.ClassName"). As outras duas maneiras dependem de se ter uma referência à classe. Por exemplo, se você tiver um objeto, também poderá obter sua classe.




