English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
本文实例讲述了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.