English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introdução e resumo de exemplos de uso do mecanismo de reflexão em Java

本文实例讲述了Java编程反射机制用法。分享给大家供大家参考,具体如下:

前言:反射:动态获取类(字节码文件如本篇中的Person.class),并对其成员进行运行。反射在Android应用层的开发中可能遇到会稍微少一点,但对于想打通底层的小伙伴来说,必须要熟练掌握运用。

实体类

Person.java

package com.sunwenou.reflect;// 包名
public class Person {
  private String name;
  private int age;
  public Person() {// 无参
  }
  public Person(String name, int age) {// com parâmetro
    super();
    this.name = name;
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public String toString() {
    return name+","+age;
  }
  public void show() { // sem parâmetro
    System.out.println("show");
  }
  public void fun(String ss) { // com parâmetro
    System.out.println(ss);
  }
  public static void function() { // estático
    System.out.println("static");
  }
}

método dinâmico de obtenção do arquivo bytecode

Neste artigo, para tornar o artigo mais conciso, geralmente lança Exception e omite importação, etc.

package com.sunwenou.reflect;
public class Demo1 {
  /**
   * método dinâmico de obtenção do arquivo bytecode
   * 1: usar o método Class getClass() fornecido pela classe Object
   *  : Este método precisa de um objeto
   * 2: Cada tipo de dados tem um atributo estático class, que retorna o objeto bytecode do tipo de dados
   *  int.class  Person.class
   * 3: usar o método forName() fornecido pela Class
   *  Basta fornecer uma string, essa string é composta por+constituição do nome da classe
   */
  public static void main(String[] args) throws Exception {
    //getClaz();
    //getCalz2()
    getClaz3()
  }
  //Usar o método forName() fornecido pela Class
  public static void getClaz3() throws Exception {
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person");
    System.out.println(claz==claz2);
  }
  //Cada tipo de dados tem um atributo estático class
  public static void getCalz2() {
    Class<Person> p1 = Person.class;
    Class<Person> p2 = Person.class;
    System.out.println(p1==p2);
  }
  //Usar o método Class getClass() fornecido pela classe Object
  public static void getClaz() {
    Person person1 = new Person();
    Class<? extends Person> claz = person1.getClass();//Person.class
    Person person2 = new Person();
    Class<? extends Person> claz2 = person2.getClass();//Person.class
    System.out.println(claz==claz2);
  }
}

Obter dinamicamente a classe e criar um objeto

package com.sunwenou.reflect;
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //createObj();
    createObj2()
  }
  public static void createObj2() throws Exception {
    //Person person = new Person("lisi",23);
    //Obter o objeto bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class
    //Obter o objeto do tipo Constructor do método de construtor com parâmetros
    Constructor constructor = claz.getConstructor(String.class,int.class);
    //Usar o método de criação de objetos fornecido pelo Constructor
    Person person = (Person)constructor.newInstance("lisi",23);
    System.out.println(person);
  }
  public static void createObj() throws Exception {
    //Person person = new Person();
    //Obter o objeto bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Object obj = claz.newInstance();//Padrão usar o método de construtor vazio para criar objetos
    System.out.println(obj);
  }
}

Obter dinamicamente a classe e atribuir valor ao membro da variável

package com.sunwenou.reflect;
public class Demo3 {
  public static void main(String[] args) throws Exception {
    //Person p = new Person();
    //p.name = "lisi";
    //Obter o objeto bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //Obter o objeto do tipo Field do membro da variável de membro
    //Field field = claz.getField("name");//Obter é o membro de permissão pública
    Field field = claz.getDeclaredField("name");//Obter todos os campos declarados
    System.out.println(field);
    //Variáveis de membro não estáticas dependem do objeto
    Object obj = claz.newInstance();
    field.setAccessible(true);//Quebra de segurança, tornar acessível
    field.set(obj, "张三");
    System.out.println(obj);
  }
}

Obter dinamicamente a classe e executar métodos

package com.sunwenou.reflect;
public class Demo4 {
  public static void main(String[] args) throws Exception {
    //method1()
    method2()
    method3()
  }
  public static void method3() throws Exception {
    //Obter o objeto bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("function", null);
    m.invoke(null, null);
  }
  ////Executar método com parâmetros
  public static void method2() throws Exception {
    //Obter o objeto bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("fun", String.class);
    Object obj = claz.newInstance();
    m.invoke(obj, "hello");
  }
  //Executar método sem parâmetros
  public static void method1() throws Exception {
    //Person person = new Person(); person.show();
    //Obter o objeto bytecode
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //Obter o objeto bytecode do método a ser executado
    Method m = claz.getMethod("show", null);
    //Métodos não estáticos dependem do objeto
    Object obj = claz.newInstance();
    //Executar método
    m.invoke(obj, null);
  }
}

Esta é a utilização básica da reflexão, podemos criar objetos através do arquivo bytecode do objeto quando não podemos criar objetos de maneira normal, executar métodos dentro deles, você aprendeu?

Leitores interessados em mais conteúdo sobre Java podem consultar as seções especializadas deste site: 'Introdução e Aperfeiçoamento em Programação Orientada a Objetos em Java', 'Tutorial de Estruturas de Dados e Algoritmos em Java', 'Técnicas de Manipulação de Nós DOM em Java', 'Resumo de Técnicas de Manipulação de Arquivos e Diretórios em Java' e 'Resumo de Técnicas de Manipulação de Cache em Java'.

Espero que o conteúdo deste artigo ajude a todos a melhorar a programação em Java.

Declaração: O conteúdo deste artigo foi extraído da internet, pertence ao respectivo proprietário, foi contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relevantes. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w.3Aviso: Este conteúdo foi extraído da internet, pertence ao respectivo proprietário, foi carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relevantes. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w, fornecendo provas relevantes. Se confirmado, o conteúdo suspeito será imediatamente removido.

Você também pode gostar