Proxy dinámico Java en modo proxy
1. Descripción general
Java define su propio proxy en el paquete java.lang.reflect. Usando las clases de este paquete, podemos crear dinámicamente una clase de proxy en tiempo de ejecución e implementar una o más interfaces. Y reenvíe las llamadas al método a la clase que especifique. Debido a que el proxy real se crea en tiempo de ejecución, se denomina proxy dinámico.
Proxy: Está completamente generado por java e implementa la interfaz temática completa.
InvocationHandler: cualquier llamada a un método en el Proxy se pasará a esta clase. InvocationHandler controla el acceso a RealSubject.
Debido a que Java nos ha ayudado a crear la clase Proxy, necesitamos tener una manera de decirle a la clase Proxy lo que queremos hacer. No podemos escribir código en la clase Proxy como antes, porque la clase Proxy es. no implementado por nosotros. Entonces, ¿dónde deberíamos colocarlo? En la clase InvocationHandler, la clase InvocationHandler es la respuesta a cualquier invocación del proxy. Podemos pensar en InvocationHandler como el objeto que el agente solicita para realizar el trabajo real después de recibir la llamada al método.
2. java.lang.reflect.InvocationHandler
Una interfaz implementada por la instancia de proxy tiene solo un método invoke() en su interior, con la siguiente firma;
Código Java
Invocación pública de objeto (proxy de objeto, método de método, argumentos de objeto[])
Cuando se llama al método proxy, el proxy reenviará la llamada a InvocationHandler. También se llamará al método invoke().
3. java.lang.reflect.Proxy
Proporciona métodos estáticos para crear clases e instancias de proxy dinámico. También es la superclase de todas las clases de proxy dinámico creadas por estos métodos. el método estático que usamos a menudo es:
Código Java
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
4. p>
Situación: Puede ver y modificar el nombre y el sexo, pero no puede modificar la tarifa. Otros pueden ver el nombre, el sexo y modificar la tarifa, pero no pueden modificar el nombre y el sexo.
4.1 Definir una interfaz:
Código Java
interfaz pública Persona {
String getName();
String getGender();
void setName(String nombre);
void setGender(String género);
void setRate(int rate); p>
void setGender(String género);
void setRate(int rate);
p>int getRate();
} p>
4.2 Definir una clase que implemente la interfaz Person
Código Java
la clase pública PersonImpl implementa Person {
String name;
Género de cadena;
Intereses de cadena;
int rate;
public String getName() {
return name;
}
public void setName(nombre de cadena) {
this.name = nombre;
}
public String getGender() {
return género;
}
public void setGender(String género) {
this.gender = género;
}
public String getInterests() {
devolver intereses
}
public void; setInterests(String interests) {
this.interests = interest;
}
public int getRate() {
tasa de retorno;
}
public void setRate(int rate) {
this.rate = rate;
}[siguiente página]
4.3 Definir la clase OwnerInvocationHandler, lo que significa que si es la persona, el nombre y el sexo se pueden modificar y ver.
Código Java
la clase pública OwnerInvocationHandler implementa InvocationHandler{
Persona privada personBean;
Propietario públicoInvocationHandler(Person personBean){
this.personBean = personBean;
}
@Override
invocación pública de objeto (proxy de objeto, método de método, argumentos de objeto[])
lanza IllegalAccessException {
prueba {
if(method.getName().startsWith("get")){//Si el nombre del método es get, luego llame al método get correspondiente en la clase de persona
return método.invoke(personBean, args);
}else if(method.getName().equals("setRate") ){ // Si el método es setRate, lanza una excepción
lanza una nueva IllegalAccessException("access deny");
}else if(method.getName().startsWith(" set")){ //Si está configurado, llame al método correspondiente del conjunto en la clase de persona
return método.invoke(personBean, args);
}else { p>
System.out.println("invocación sin método");
}
} catch (InvocationTargetException e) {
e.printStackTrace ();
}
return null;
}
}
4.4 Definir la clase NonInvocationHandler para Indicar que si no es presencial, podrás consultar tu nombre, sexo y modificar la tarifa.
Código Java
La clase pública NonInvocationHandler implementa InvocationHandler{
//
#p#subtitle#e#
Persona privada persona;
public NonInvocationHandler(Persona persona){
this.person = persona;
}
@Override
invocación pública de objeto (proxy de objeto, método de método, argumentos de objeto[])
lanzamientos lanzables {
if(method.getName().startsWith("setRate ")){
return método.invoke(persona, args);
}si no (method.getName().startsWith("get")){
return método.invoke(persona, argumentos);
} else {
System.out.println("invocación sin método");
return null;
}
}
}
4.5 Clase de prueba MyDynamicProxy
Código Java
clase pública MyDynamicProxy {
Persona pública getOwnerPersonBeanProxy(Persona persona){
return (Persona)Proxy.newProxyInstance(persona.getClass().getClassLoader(), p> p>
persona.getClass().getInterfaces(), nuevo OwnerInvocationHandler(persona));
}
Persona pública getNonPersonBeanProxy(Persona persona){
return (Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),
person.getClass().getInterfaces(), new NonInvocationHandler(persona));
}
public static void main(String[] args) {
MyDynamicProxy mdp = new MyDynamicProxy();
mdp.test();
p>}
prueba pública de anulación(){
//
Persona persona = getPersonBeanFromDB1();
Persona personProxy = getOwnerPersonBeanProxy(persona);
System.out.println(personProxy.getName());
prueba {
personProxy.setRa
te(2);
} catch (Excepción e) {
System.out.println("can not setRate");
}
//
Persona persona1 = getPersonBeanFromDB1();
Persona personaProxy2 = getNonPersonBeanProxy(persona1);
System.out.println(personProxy2. getName());
personProxy2.setRate(2);
System.out.println(personProxy2.getRate());
}
Persona privada getPersonBeanFromDB1(){
Persona pb = new PersonImpl();
pb.setName("remy");
pb. setGender("girl");
pb.setRate(1);
return pb }
Resultado de salida:
Java; Código
remy no se puede establecerCalificar remy 2
#p#subtitle#e#