Primero analice los tres roles en el modelo de proxy dinámico:
1. Rol abstracto: en el proxy estático puede ser una clase abstracta, pero en el proxy dinámico solo puede ser una interfaz
2. Rol real: simplemente implementa los métodos en el rol abstracto.
3. Rol de agente: lo más repugnante es el papel de agente en el agente dinámico. Debe contener una referencia al personaje real.
Implica una interfaz y una clase, la interfaz InvocationHandler y la clase Proxy. Según la documentación JDK, la interfaz InvocationHandler se implementa mediante una clase, y una instancia de esta clase es el objeto controlador correspondiente a un objeto proxy. Cuando se llama a un método del objeto proxy, el método se codificará y se asignará al método de invocación de su objeto controlador correspondiente para llamar.
Copie el código de código de la siguiente manera:
// Rol abstracto:
interfaz pública AbstractRole
{
espectáculo público vacío();
}
//Personaje real:
la clase pública RealRole implementa AbstractRole
{
@Anular
public void show(){ System.out.println("muéstrame tu casa");
}
//Rol de agente:
// Creo que esto es solo un pseudo-agente. ¡El pseudo-agente se me ocurrió a mí mismo = =! , porque en realidad es el controlador correspondiente al agente
El controlador de clase pública implementa InvocationHandler
{
Private Object realRole; // La función de proxy debe tener una referencia a la función real. Si se define como tipo de objeto, es universal.
Controlador público (objeto rol real)
{ this.realRole = realRole }
@Anular
Invocación de objeto público (proxy de objeto, método de método, argumentos de objeto [])
{
System.out.println("Dame tu dinero"); // Esta es una función adicional agregada por el propio rol de agente.
Method.invoke(this.realRole, args); //Invoca el método del rol real a través de la reflexión.
System.out.println("Ok...la casa es tuya");//Esta es una función adicional agregada por el propio rol de agente.
}
public Object factory()//Generar el rol de agente real a través del método de fábrica
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); // ¡El método newProxyInstance en Proxy tiene dos características muy importantes! La primera es crear dinámicamente una clase de proxy, si la salida parece ser una clase llamada $Proxy0, la segunda es generar una instancia a través de la clase creada dinámicamente.
}
}
//Cliente:
prueba de clase pública
{
principal vacío estático público (String [] argumentos)
{
RealRole realRole = new RealRole();//Qué rol real quieres representar, simplemente crea un nuevo rol real
Handler handler = new Handler(realRole);// Aquí se genera el controlador correspondiente a la clase proxy. También quiero llamarlo objeto pseudo-proxy.
AbstractRole proxy = (AbstractRole)handler.factory();// Generar objetos proxy a través de métodos de fábrica
}
}
Quizás se pregunte cómo se puede convertir a la fuerza el rol de agente aquí en un rol abstracto. La razón radica en el método newProxyInstance. Este método es demasiado interesante. Como se mencionó anteriormente, generará automáticamente una clase y luego generará un objeto proxy a través de la clase. De hecho, esta clase implementa la clase de rol abstracto. ¿Por qué? Porque el segundo parámetro ya ha especificado qué interfaces implementa. Entonces puedes forzar la transferencia. Después de forzar la transferencia, puedes llamar a los métodos en la función abstracta.
proxy.show();//¡Está bien! Preste atención a esta oración. La marqué en rojo al principio: "Este método se codificará y asignará al método de invocación de su objeto controlador correspondiente para llamar". pasado al método de invocación en el objeto controlador. Por supuesto, también se siguen los parámetros del método show, pero el método show aquí no tiene parámetros. Entonces, la oración proxy.show() en realidad llama al método de invocación en el objeto controlador.