Bytecode Java e mecanismo de reflexão

    O código de bytes é uma garantia importante para os recursos de plataforma cruzada da linguagem Java e uma base importante para o mecanismo de reflexão. Por meio do mecanismo de reflexão, podemos não apenas ver os atributos e métodos de uma classe, mas também chamar os métodos de outra classe em uma classe, mas apenas se tivermos o arquivo bytecode (ou seja, o arquivo .class) do classe.

1 arquivos Bytecode e .class

    Depois de escrever um arquivo com a extensão .java, se ele puder ser executado (por exemplo, ele contém a função principal), então podemos executar o arquivo .java clicando no botão Executar em MyEclipse.

    Mas, neste momento, MyEclipse esconde um passo importante de nós: ele primeiro compila o arquivo .java em um arquivo bytecode com uma extensão .class e, em seguida, a Java Virtual Machine (JVM) está no sistema operacional atual (por exemplo , execute este arquivo .class na janela 10).

    Em outras palavras, o arquivo .java deve ser compilado em um arquivo .class antes de poder ser executado. O que é mais surpreendente é que o arquivo .class compilado no sistema Window 7 pode ser executado diretamente no sistema Linux (claro, este sistema tem de Há um ambiente de execução Java) .Este é o recurso de plataforma cruzada do Java, que também é chamado de capacidade de "compilar e executar em qualquer lugar".

    Estou um pouco fora do tópico. Voltando ao tópico da reflexão. Contanto que possamos obter o arquivo bytecode de .class, através do mecanismo de reflexão, podemos não apenas ver o método de atributo e outras informações no arquivo java correspondente a this .class, mas também chama It corresponde ao método no arquivo java.

2 A classe de classe (C é maiúscula) é a base gramatical da implementação da reflexão

    Com algumas ferramentas, podemos abrir o arquivo .class e ver os atributos e métodos contidos nele, mas não podemos programar diretamente no arquivo .class. Temos que usar a classe (C é maiúsculo).

    O nome completo da classe Class é java.lang.Class. Quando uma classe ou interface (em suma, o arquivo de classe compilado do arquivo java) é carregada na Java Virtual Machine (JVM), um java associado a ela será gerado .lang.Class objeto, na parte de reflexão do código, geralmente acessamos e usamos as propriedades e métodos da classe de destino através desta classe.

    Através do mecanismo de reflexão, os atributos da classe especificada podem ser vistos a partir do arquivo .class, como o modificador de atributo, o atributo e o nome da variável do tipo e atributo. Por meio do seguinte ReflectionReadVar.java, examinamos a abordagem específica da demonstração.    

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 uma classe MyValCalss na linha 3 e definimos três variáveis ​​de atributo nas linhas 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	}

     Na 10ª linha da função principal, através de MyValClass.class, obtemos a variável clazz do tipo Class <MyValClass>, nesta variável são armazenadas algumas informações da classe MyValClass.

    Na linha 12, o método clazz.getDeclaredFields () é utilizado para obter as informações de todos os atributos da classe MyValClass, e armazenar as informações desses atributos na variável fields do tipo array Field.

    O loop for que passou a 13ª linha produz essas informações de atributo por sua vez. Especificamente, o modificador do atributo é gerado pelo código na linha 14, o tipo do atributo é gerado pelo código na linha 16 e o ​​nome da variável do atributo é gerado pelo código na linha 18. A saída desse código é a seguinte, a partir da qual podemos ver as informações de cada atributo.

  1. int val1 privado
  2. public class java.lang.String val2
  3. classe final protegida java.lang.String val3

Acho que você gosta

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