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