Este artigo descreve o uso do mecanismo de reflexão de programação Java. Compartilhe -o para sua referência, como segue:
Prefácio: Reflexão: Obtenha dinamicamente a classe (arquivo de bytecode como Pessoa.class neste artigo) e execute seus membros. A reflexão pode ser um pouco menos encontrada no desenvolvimento da camada de aplicação do Android, mas para aqueles que desejam passar pela camada subjacente, eles devem ser proficientes para usá -la.
Classe de entidade
Person.java
pacote com.sunwenou.reflect; // Nome do pacote Public Class Pessoa {Nome da String Private; private Int Age; public Person () {// No Parâmetro} Pessoa Pública (Nome da String, Int Age) {// com Parâmetro super (); this.name = nome; this.age = idade; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public int getage () {Age de retorno; } public void setage (int Age) {this.age = Age; } @Override public String tostring () {Return Name+","+Age; } public void show () {// em vazio parâmetros system.out.println ("show"); } public void Fun (String SS) {// com parâmetro System.out.println (SS); } public static void function () {// static system.out.println ("static"); }}Métodos para obter dinamicamente os arquivos de bytecode
Para fazer com que a postagem do blog pareça concisa, uma exceção é lançada e a importação é omitida, a mesma abaixo.
pacote com.sunwenou.reflect; public class Demo1 { /*** Método para obter dinamicamente os arquivos de bytecode* 1: use o método getClass () fornecido pela classe de objeto* Este método requer objetos* 2: cada tipo de dados tem um arquivo de classe estático*, e o tipo de dados de dados. É necessária uma string, que consiste no nome do pacote + nome da classe*/public static void main (string [] args) lança exceção {// getClaz (); // getCalz2 (); getClaz3 (); } // Use o método forname () fornecido pela classe public static void getClaz3 () lança exceção {classe <?> Claz = class.formorne ("com.sunwenou.reflect.person"); Classe <?> Claz2 = classe.formane ("com.sunwenou.reflect.person"); System.out.println (claz == claz2); } // Cada tipo de dados possui um atributo estático atributo public static void getCalz2 () {classe <SOSOY> p1 = Person.class; Classe <Pesso> P2 = Person.class; System.out.println (p1 == p2); } // Use o método da classe getClass () fornecido pela classe Object public static void getClaz () {pessoa pessoa1 = new Person (); Classe <? estende a pessoa> claz = pessoa1.getclass (); // Person.class Pessoa Person2 = New Pessoa (); Classe <? estende a pessoa> claz2 = PERSON2.GETCLASS (); // PERSON.Class System.out.println (Claz == Claz2); }}Obtenha dinamicamente a classe e crie o objeto
pacote com.sunwenou.reflect; public class Demo2 {public static void main (string [] args) lança exceção {// createObj (); createObj2 (); } public static void createObj2 () lança exceção {// pessoa pessoa = nova pessoa ("lisi", 23); // Obtenha a classe Bytecode Arquivo Object //Person.class // Obtenha o objeto do construtor de tipos ao qual o método do construtor com parâmetros pertence. Construtor construtor = claz.getConstructor (string.class, int.class); // Crie o objeto usando o método de criação de um objeto fornecido pelo construtor Pessoa da classe Classe = (Person) construtor.NewInstance ("Lisi", 23); System.out.println (pessoa); } public static void createObj () lança exceção {// pessoa pessoa = new pessoa (); // Obtenha a classe Bytecode Arquivo Object Objeto obj = claz.newInstance (); // Por padrão, use o construtor de parâmetros vazios para criar o objeto System.out.println (obj); }}Obtenha dinamicamente a classe e atribua valores às variáveis de membros
pacote com.sunwenou.reflect; public class Demo3 {public static void main (string [] args) lança exceção {// pessoa p = new Person (); //p.name = "lisi"; // Obtenha a classe Bytecode Arquivo Object // Obtenha o objeto do tipo de campo ao qual a variável de membro pertence // campo de campo = claz.getfield ("nome"); // obtenha o membro com campo de permissão pública = Claz.getDecLaredField ("Nome"); // obtém todos os campos declarados System.out.println (campo); // variáveis não estáticas de membro são dependentes do objeto obj = claz.NewInstance (); field.setAccessible (true); // rachaduras de força bruta, definidas como field.set acessível (obj, "zhang san"); System.out.println (obj); }}Obtenha dinamicamente a classe e execute o método
pacote com.sunwenou.reflect; public class Demo4 {public static void main (string [] args) lança exceção {// method1 (); método2 (); método3 (); } public static void Method3 () lança Exceção {// Obtenha a classe ByteCode File Object Método m = claz.getMethod ("function", nulo); M.Invoke (nulo, nulo); } //// execute o método com parâmetros public static void method2 () lança exceção {// obtenha a classe Bytecode Arquivo Object classe <?> Claz = classe.ForName ("com.sunwenou.reflect.person"); Método m = claz.getMethod ("diversão", string.class); Objeto obj = claz.newInstance (); M.Invoke (OBJ, "Hello"); } // Execute o método sem parâmetros public static void method1 () lança exceção {// pessoa pessoa = new pessoa (); pessoa.Show (); // Obtenha a classe Bytecode Arquivo Object // Obtenha o objeto de arquivo bytecode ao qual o método executado pertence. Método m = claz.getMethod ("show", nulo); // Os métodos não estáticos são dependentes do objeto obj = claz.newInstance (); // Execute o método M.Invoke (OBJ, NULL); }}Este é o uso básico da reflexão. Podemos criar objetos através do arquivo bytecode do objeto quando não podemos criar objetos normalmente e executá -los. Você aprendeu como fazer isso? ?
Para obter mais informações sobre o conteúdo relacionado ao Java, consulte os tópicos deste site: "Introdução e tutorial avançado sobre programação orientada a objetos Java", "Tutorial sobre estrutura de dados e algoritmo Java", "Resumo de Java Operação Dom Node Skills", Summary of Java File and Directory Operation Skills "e" Summar
Espero que este artigo seja útil para a programação Java de todos.