Mecanismo de reflexión y código de bytes de Java

    Byte Code es una garantía importante para las características multiplataforma del lenguaje Java y una base importante para el mecanismo de reflexión. A través del mecanismo de reflexión, no solo podemos ver los atributos y métodos de una clase, sino también llamar a los métodos de otra clase en una clase, pero solo si tenemos el archivo de código de bytes (es decir, el archivo .class) de la clase relacionada. clase.

1 Bytecode y archivos .class

    Después de escribir un archivo con una extensión .java, si se puede ejecutar (por ejemplo, contiene la función principal), entonces podemos ejecutar el archivo .java haciendo clic en el botón ejecutar en MyEclipse.

    Pero en este momento, MyEclipse nos oculta un paso clave: primero compila el archivo .java en un archivo de código de bytes con una extensión de .class, y luego, la máquina virtual Java (JVM) está en el sistema operativo actual (por ejemplo , ejecute este archivo .class en la ventana 10).

    En otras palabras, el archivo .java debe compilarse en un archivo .class antes de que pueda ejecutarse. Lo que es más sorprendente es que el archivo .class compilado en el sistema Windows 7 se puede ejecutar directamente en el sistema Linux (por supuesto, este El sistema tiene que Hay un entorno de ejecución de Java) Esta es la característica multiplataforma de Java, que también se llama la capacidad de "compilar y ejecutar en todas partes".

    Estoy un poco fuera de tema. Volviendo al tema de la reflexión. Siempre que podamos obtener el archivo de código de bytes de .class, a través del mecanismo de reflexión no solo podemos ver el método de atributo y otra información en el archivo java correspondiente a this .class, pero también llamar. Corresponde al método en el archivo java.

2 Class class (C es mayúscula) es la base gramatical de la implementación de la reflexión

    Con algunas herramientas, podemos abrir el archivo .class y ver los atributos y métodos que contiene, pero no podemos programar directamente contra el archivo .class Tenemos que usar la clase (C está en mayúsculas).

    El nombre completo de la clase Class es java.lang.Class. Cuando una clase o interfaz (en resumen, el archivo de clase compilado del archivo java) se carga en la máquina virtual Java (JVM), un java asociado con ella será objeto .lang.Class generado, en la parte de reflexión del código, generalmente accedemos y usamos las propiedades y métodos de la clase de destino a través de esta clase.

    A través del mecanismo de reflexión, los atributos de la clase especificada se pueden ver desde el archivo .class, como el modificador de atributo, el atributo y el nombre de variable del tipo y atributo. A través del siguiente ReflectionReadVar.java, analizamos el enfoque específico en la demostración.    

1	import java.lang.reflect.Field;
2	import java.lang.reflect.Modifier;
3	class MyValClass{
4		private int val1;
5		public String val2;
6		final protected String val3 = "Java";
7	}

    Definimos una clase MyValCalss en la línea 3 y definimos tres variables de atributo en las líneas 4 a 6.    

8	public class ReflectionReadVar {
9		public static void main(String[] args) {
10			Class<MyValClass> clazz = MyValClass.class;
11			//获取这个类的所有属性
12	        Field[] fields = clazz.getDeclaredFields();
13		    for(Field field : fields) {
14		    	   //输出修饰符	    	   System.out.print(Modifier.toString(field.getModifiers()) + "\t");
15		    	   //输出属性的类型
16		       System.out.print(field.getGenericType().toString() + "\t");
17		    	   //输出属性的名字
18		    	   System.out.println(field.getName());
19		      }
20		}
21	}

     En la décima línea de la función principal, a través de MyValClass.class, obtenemos la variable clazz de tipo Class <MyValClass>, en esta variable se almacena cierta información de la clase MyValClass.

    En la línea 12, se usa el método clazz.getDeclaredFields () para obtener la información de todos los atributos en la clase MyValClass, y almacenar la información de estos atributos en la variable fields del tipo de arreglo Field.

    El bucle for que pasó la línea 13 genera esta información de atributos a su vez. Específicamente, el código de la línea 14 genera el modificador del atributo, el código de la línea 16 genera el tipo de atributo y el código de la línea 18 genera el nombre de la variable del atributo. La salida de este código es la siguiente, desde la cual podemos ver la información de cada atributo.

  1. privado int val1
  2. clase pública java.lang.String val2
  3. protegida clase final java.lang.String val3

Supongo que te gusta

Origin blog.csdn.net/sxeric/article/details/113058457
Recomendado
Clasificación