Tres problemas
O que é reflexão? Para que pode ser usada a reflexão? Em quais cenários a reflexão é usada e como?
O programa que pode analisar a habilidade é chamado de reflexão!
O mecanismo de reflexão pode ser usado
1. A capacidade de analisar classes em tempo de execução.
2. Visualize o objeto em tempo de execução, por exemplo: escreva um método toString () para todas as classes usarem (a reflexão pode obter todas as variáveis, privada também pode ser obtida).
3. Realize o código de operação geral da matriz.
4. Use o objeto Method, que é muito semelhante ao ponteiro de função em C ++.
Os programas que manipulam dinamicamente o código Java são amplamente usados em JavaBeans e em ferramentas de desenvolvimento.Por exemplo, o prompt que aparece após o ponto do objeto é implementado por reflexão.
Durante a execução do programa, o sistema Java runtime sempre mantém uma identificação de tipo chamada runtime para todos os objetos.
Essas informações rastreiam a classe à qual cada objeto pertence, e a máquina virtual usa as informações do tipo de tempo de execução para selecionar o método correspondente a ser executado,
A classe que armazena essas informações é chamada de Classe.
O método getClass () na classe Object retornará uma instância do tipo Class.
O método de classe mais comumente usado é getName, que retornará o nome do caminho completo da classe.
Chame o método estático forName () para obter o objeto Class correspondente ao nome da classe.
Class class = Class.forName ("com.xx.xxx");
A classe Class é na verdade uma classe genérica, o que complica o conceito já abstrato.
Na maioria dos problemas práticos, você pode ignorar o parâmetro de tipo e usar a classe Class original.
O método newInstance () pode ser usado para criar dinamicamente uma instância de uma classe.
Ele chama o construtor sem argumento por padrão para criar uma instância; se não houver um construtor padrão, ele lançará uma exceção!
Use reflexão para analisar a estrutura de uma classe e use Field, Method e Constructor para descrever o domínio, método e construtor da classe, respectivamente.
Todas as três classes têm um método chamado getName (), que retorna o nome do item.
A classe Field tem um método getType () para retornar um objeto Class que descreve o tipo do campo.
As classes Method e Constructor têm métodos que podem relatar os tipos de parâmetros, que retornarão um valor inteiro e usarão diferentes opções de bits para descrever o modificador estático público.
Existem métodos isPublic, isPrivate e isFinal na classe Modifier para determinar se o construtor ou construtor é público, privado ou final.O método toString () pode imprimir o modificador.
Aqui está uma classe, você pode inserir o nome do caminho completo da classe já em Java para imprimir seus métodos.
package com.wavewave.demo.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
/**
* @author wavewave
* @CreateDate: 2020/4/13 1:51 PM
* @Description:
* @Version: 1.0
*/
public class Test {
public static void main(String[] args) {
String name;
if (args.length > 0) {
name = args[0];
} else {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入类名称");
name = scanner.next();
}
try {
Class cl = Class.forName(name);
Class superCl = cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print("class " + name);
if (superCl != null && superCl != Object.class) {
System.out.print(" extends " + superCl.getName());
}
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static void printConstructors(Class cl) {
Constructor[] constructors = cl.getDeclaredConstructors();
for (Constructor c : constructors) {
String name = c.getName();
System.out.print(" ");
String modifiers = Modifier.toString(c.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print(name + "(");
Class[] parameterTypes = c.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
if (i > 0) {
System.out.print(", ");
}
System.out.print(parameterTypes[i].getName());
}
System.out.println(");");
}
}
private static void printMethods(Class cl) {
Method[] methods = cl.getDeclaredMethods();
for (Method m : methods) {
Class returnType = m.getReturnType();
String name = m.getName();
System.out.println(" ");
String modifiers = Modifier.toString(m.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.println(returnType.getName() + " " + name + "(");
Class[] parameterTypes = m.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
if (i > 0) {
System.out.print(",");
}
System.out.print(parameterTypes[i].getName());
}
System.out.println(");");
}
}
private static void printFields(Class cl) {
Field[] fields = cl.getDeclaredFields();
for (Field f : fields) {
Class type = f.getType();
String name = f.getName();
System.out.print(" ");
String modifiers = Modifier.toString(f.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print(type.getName() + " " + name + ";");
}
}
}
Você pode experimentar!