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.
- int val1 privado
- public class java.lang.String val2
- classe final protegida java.lang.String val3