Aprendí
reflexión hace mucho tiempo, tengo un poco de conocimiento de reflexión, hoy lo he resuelto en detalle.
1. Cómo obtener el objeto de clase
-
Class.forName ("nombre de clase completo"): carga el archivo de código de bytes en la memoria y devuelve el objeto de clase
Se usa principalmente en archivos de configuración, define el nombre de la clase en el archivo de configuración, lee el archivo y carga la clase
-
Class name.class: Obtenido por la clase de atributo del nombre de la clase
Se utiliza principalmente para la transferencia de parámetros
-
Object.getclass (): el método getclass () se define en la clase de objeto
La forma de obtener el código de bytes que se usa principalmente para los objetos
-
Conclusión: El mismo archivo de código de bytes (* .class) solo se cargará una vez durante la ejecución de un programa. El objeto Class obtenido por cualquier método es el mismo
2. Función del objeto de clase
2.1 Obtener función
-
Obtener variables miembro
- Field [] getFields (): obtiene todas las variables públicas
- Field getField (nombre de cadena): Obtiene la variable pública del nombre especificado
- Field [] getDeclaredFields (): Obtiene todas las variables miembro
- Field getDeclaredField (nombre de cadena): Obtiene la variable con el nombre especificado
Class testClass = Test.class; // 获取类对象
Field field = testClass.getDeclaredField("name"); // 获取变量
field.setAccessible(true); // 解除私有
Test test = new Test();
Object string = field.get(test); // 获取私有的值
System.out.println("我是原来的:" + string);
field.set(test, "lr"); // 修改私有的值
Object string1 = field.get(test);
System.out.println("我是后来的:" + string1);
-
Obtener método de construcción
- constructor <?> getconstructors ()
- Constructorgetconstructor (类 <?>… ParameterTypes)
- Constructor getDeclaredConstructor (类 <?>… ParameterTypes)
- constructor <?> getDeclaredconstructors ()
Class testClass = Test.class; // 获取类对象
Constructor constructor = testClass.getConstructor(String.class); // 获取构造方法
Object test = constructor.newInstance("张三"); // 实例化赋予初值
System.out.println(test);
-
Obtener método de miembro
- Método [] getMethods ()
- Método getHethod (nombre de cadena , 类 <?>… ParameterTypes)
- Método [l getDeclaredMethods ()
- Método getDeclaredMethod (nombre de cadena , 类 <?>… ParameterTypes)
Class testClass = Test.class; // 获取类对象
Test test = new Test();
Method method = testClass.getMethod("test", int.class); // 放入实例化和参数
method.invoke(test, 1); // 运行该方法
-
Obtener el nombre de la clase
- String.getName ()
-
Campo: variable miembro
- Establecer valor
establecido () - Obtener valor
get () - Ignore el modificador de permisos de acceso
setAccessible (verdadero)
- Establecer valor
-
Constructor: método de construcción
- Crear objeto
- newInstance (Objeto ... initargs)
- Crear objeto
-
Método: objeto de método
- Método de ejecución
- Invocación de objeto (Object obj, Object ... args)
- Obtener el nombre del método
- String getName: obtiene el nombre del método
- Método de ejecución
3. Caso
- Requisitos: escribir un marco que pueda ayudarnos a crear objetos de cualquier clase y ejecutar cualquiera de sus métodos sin cambiar ningún código de la clase
- lograr
- Archivo de configuración
- reflexión
- paso
- Defina el nombre de clase completo del objeto que se creará y el método que se ejecutará en el archivo de configuración
- Cargar y leer archivos de configuración en el programa
- Utilice tecnología de reflexión para cargar archivos de clase en la memoria
- Método de creación
- Método de ejecución
Reflexionar Clase
package fanshe;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class Reflect {
public static void main(String[] args) throws Exception {
// 创建对象
Properties properties = new Properties();
// 获取类的加载器,可以找到src下的文件
ClassLoader classLoader = Reflect.class.getClassLoader();
// 读入文件
InputStream stream = classLoader.getResourceAsStream("pro.properties");
// 传入字节流
properties.load(stream);
// 获取配置文件中数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
// 加载该类进内存
Class cls = Class.forName(className);
// 创建对象、实例化
Object obj = cls.newInstance();
Method method = cls.getDeclaredMethod(methodName);
method.invoke(obj);
}
}
propiedades pro.
className=fanshe.Person
methodName=sleep