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) {// con parámetros 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() { // sin parámetros System.out.println("show"); } public void fun(String ss) { // con parámetros System.out.println(ss); } public static void function() { // estático System.out.println("static"); } }
método dinámico para obtener el archivo bytecode
En este artículo, para que el artículo sea más conciso, se lanza Exception en general y se omite import, etc.
package com.sunwenou.reflect; public class Demo1 { /** * método dinámico para obtener el archivo bytecode * 1:usar el método Class getClass() proporcionado por Object * :este método necesita un objeto * 2:cada tipo de datos tiene una propiedad estática class, esta propiedad devuelve el objeto del archivo bytecode correspondiente a este tipo de datos * int.class Person.class * 3:usar el método forName() proporcionado por Class * Sólo se necesita proporcionar una cadena, esta cadena está formada por el nombre del paquete+composición del nombre de la clase */ public static void main(String[] args) throws Exception { //getClaz(); //getCalz2() getClaz3() } //Usar el método forName() proporcionado por 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 datos tiene una propiedad estática class public static void getCalz2() { Class<Person> p1 = Person.class; Class<Person> p2 = Person.class; System.out.println(p1==p2); } //Usar el método Class getClass() proporcionado por la clase 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); } }
Dinámicamente obtener la clase y crear un 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); //Obtener el objeto de archivo bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class //Obtener el objeto del tipo Constructor del método de constructor con parámetros Constructor constructor = claz.getConstructor(String.class,int.class); //Crear un objeto utilizando el método proporcionado por la clase Constructor Person person = (Person)constructor.newInstance("lisi",23); System.out.println(person); } public static void createObj() throws Exception { //Person person = new Person(); //Obtener el objeto de archivo bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Object obj = claz.newInstance();//Se utiliza por defecto el método de constructor con parámetros vacíos para crear objetos System.out.println(obj); } }
Obtener la clase dinámicamente y asignar valores a las variables de miembros
package com.sunwenou.reflect; public class Demo3 { public static void main(String[] args) throws Exception { //Person p = new Person(); //p.name = "lisi"; //Obtener el objeto de archivo bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //Obtener el objeto del tipo Field del miembro de la variable de miembros //Field field = claz.getField("name");//Obtenido es el miembro con permiso público Field field = claz.getDeclaredField("name");//Obtener todos los campos declarados System.out.println(field); //Las variables de miembros no estáticas dependen del objeto Object obj = claz.newInstance(); field.setAccessible(true);//Carga bruta, configurar como accesible field.set(obj, "张三"); System.out.println(obj); } }
Obtener la clase dinámicamente y ejecutar el método
package com.sunwenou.reflect; public class Demo4 { public static void main(String[] args) throws Exception { //method1() method2() method3() } public static void method3() throws Exception { //Obtener el objeto de archivo bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("function", null); m.invoke(null, null); } ////Ejecutar un método con parámetros public static void method2() throws Exception { //Obtener el objeto de archivo bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("fun", String.class); Object obj = claz.newInstance(); m.invoke(obj, "hello"); } //Ejecutar método sin parámetros public static void method1() throws Exception { //Person person = new Person(); person.show(); //Obtener el objeto de archivo bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //Obtener el objeto de archivo bytecode del método a ejecutar Method m = claz.getMethod("show", null); //Los métodos no estáticos dependen del objeto Object obj = claz.newInstance(); //Ejecutar método m.invoke(obj, null); } }
Esto es el uso básico de reflexión, podemos crear objetos a través de archivos de bytecode de objetos cuando no podemos crear objetos de manera normal, y ejecutar los métodos dentro de ellos, ¿lo has aprendido?
Los lectores interesados en más contenido relacionado con Java pueden ver la sección especial de este sitio: 'Introducción y avances en el diseño de programas orientados a objetos Java', 'Tutorial de estructuras de datos y algoritmos Java', 'Resumen de técnicas para operar nodos DOM Java', 'Resumen de técnicas para operar archivos y directorios Java' y 'Resumen de técnicas para operar caché Java'.
Espero que lo descrito en este artículo pueda ayudar a todos en el diseño de programas Java.
Declaración: el contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume responsabilidad por responsabilidades legales relacionadas. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.