Exploración inicial de la reflexión de Java.

Clase clase en el paquete reflejado (tenga en cuenta la mayúscula C) -tipo de identificación clase-Clase

import java.lang.reflect;

Reflexión: La capacidad de un programa para acceder, detectar y modificar su propio estado o comportamiento, es decir, autodescripción y autocontrol.

       Puede cargar, detectar y usar clases que son completamente desconocidas durante la compilación en tiempo de ejecución

       Puede ver y manipular objetos en tiempo de ejecución: cree libremente objetos basados ​​en la reflexión, variables miembro a las que no se puede acceder mediante set u get, y llame a métodos inaccesibles

 

Es decir, puede obtener toda la información de la clase a través de "reflexión", como

1. Campo: variable miembro / atributo

1  clase A {
 2      public  int age;
 3      private String name;
 4    
5      // constructor de A 
6      public A ( int age, String name)
 7      {
 8           this .age = age;
 9           this .name = name;
 10      }
 11  
12 A obj = new A (20, "li7an" );
 13 Class c = obj.getClass (); // Obtenga el ID de tipo
 14  
15  // Obtenga todos los atributos públicos de esta clase y la clase padre 
16Field [] fs = c.getFields ();
 17  
18  // Obtenga todas las propiedades públicas / protegidas / predeterminadas / privadas declaradas por esta clase 
19 Field [] fs2 = c.getDeclaredFields ();
 20  para (Field f: f2)
 21  {
 22      f.setAccessible ( true ); // Este método hace que el atributo protegido / privado también sea invocable, temporalmente se hace público 
23 }

 

2. Método: clase de método miembro

class B {
 public  void f1 () { 
out.println ( "B.f1 ()" ); 
} 
private String f2 (String s) { 
out.println ( "B.f2 ()" )
 return s; 
} 
B obj = nuevo B (); 
Clase c = obj.getClass (); 

// Obtener método público 
Método [] ms = c.getMethods ();
 para (método m: ms) {
     if ("f1" .equals (m.getName ( ))) { 
        m.invoke (obj, null ); // Al llamar a un método en reflexión, use el método invoke, en este momento debe pasar un objeto como "obj" aquí para llamar 
    } 
} 

//Obtenga todos los métodos de esta clase 
Método [] ms2 = c.getDeclaredMethods ();
 for (Método m: ms2) {
     if ("f2" .equals (m.getName ())) { 
        m.setAccessible ( true ); // Aquí nuevamente 
        String result = (String) m.invoke (obj, "abc" ); 
        out.println (result); 
    } 
}

 El m.setAccessble (verdadero); aquí solo convierte temporalmente el método privado / protegido en privado y no afecta a otros objetos en la clase B. Cuando su nuevo objeto nuevo de clase B,

el método f2 sigue siendo invisible

****************************************

Nota: Los métodos class name.class y class name.getClass () son los mismos

 

Supongo que te gusta

Origin www.cnblogs.com/li7anStrugglePath/p/12726791.html
Recomendado
Clasificación