Todos los agentes saben que cuando vas de compras, hay muchos agentes y solo venden productos originales. Por ejemplo, si desea comprar carne todos los días, el granjero es criado por el agricultor, pero si compra carne del carnicero, el carnicero puede ser considerado como un agente. Entonces, ¿por qué necesitas un agente? Cerdo y luego los mata.
Cómo implementar este proceso con el código: Deberíamos usar tres categorías: carnicero y agricultor para referirse a usted, carnicero y agricultores, respectivamente. Entre ellos, el agricultor también proporciona un método para comprar carne para llamar al carnicero.
La copia del código es la siguiente:
agricultor de clase {
public int buymeat (int dinero) {
int carne = 0;
// ... carne = ***;
carne de regreso;
}
}
El carnicero le proporciona un método para comprar carne. El código es el siguiente:
La copia del código es la siguiente:
clase Butcher {
public int buymeat (int dinero) {
Agricultor = nuevo agricultor ();
int carne = agricultor.
carne += 5;
Devolver carne;
}
}
Sin embargo, el código que compra carne del carnicero se vuelve así:
La copia del código es la siguiente:
clase tu {
Public void Work () {
int yoMoney = 10;
Butcher Butcher = New Butcher ();
int meat = Butcher.BuyMeat (YouMoney);
System.out.println ("Cocine la carne, peso:" + carne); // la cocinaste.
}
}
También podemos optimizar este programa. Es un carnicero o un agricultor.
La copia del código es la siguiente:
clase tu {
Public void Work () {
int yoMoney = 10;
Peldar Peldar = new Butcher ();
int meat = Peldar.BuyMeat (YouMoney);
System.out.println ("Cocine la carne, peso:" + carne);
}
}
interfaz Peldar {
int buymeat (int dinero);
}
clase Carnicero implementa Peldar {
@Anular
public int buymeat (int dinero) {
Agricultor = nuevo agricultor ();
int carne = agricultor.
carne += 5;
Devolver carne;
}
}
El agricultor de clase implementa Peldar {
@Anular
public int buymeat (int dinero) {
int carne = 0;
// ... carne = ***;
carne de regreso;
}
}
Este es el proxy.
Sin embargo, esto se llama proxy estático, porque la clase proxy (clase de carnicero) es escrita por usted, y el proxy dinámico es generar dinámicamente una clase proxy equivalente cuando Java se está ejecutando. Aunque la clase se genera dinámicamente, el código para matar cerdos e inyectar agua aún debe escribirse, simplemente no escriba una clase más. ¿Dónde escribirlo?
La copia del código es la siguiente:
interfaz pública InvocationHandler {
Public Object Invoke (proxy de objeto, método de método, objeto [] args) lanza luneable;
}
¿Qué significan los parámetros?
La copia del código es la siguiente:
interfaz pública InvocationHandler {
Public Object Invoke (Object Butcher, Method BuyMeat, Object [] Money) lanza Throwable;
}
El primer parámetro es un objeto de la clase proxy generada automáticamente (un objeto de la clase de carnicero que se genera automáticamente), y el segundo parámetro es el objeto del método que se llama (cómo tiene el método objetos, consulte el Java Mecanismo de reflexión). Entonces, el código para matar cerdos y llenar agua se vuelve así cuando está escrito:
La copia del código es la siguiente:
InvocationHandler MinVocationHandler = new InvocationHandler () {
@Anular
Public Object Invoke (Object Butcher, Method BuyMeat, Object [] args) lanza lanzable {
Agricultor = nuevo agricultor ();
int meat = (entero) buymeat.inboke (agricultor, args);
carne += 5;
Devolver carne;
}
};
Esto es un poco inconsistente con el método convencional de llamar al método de compra de carne del agricultor. Puede preguntar entonces ¿por qué no llamarlo directamente? Tiene muchos objetos de agricultores, incluso no objetos de agricultores, se puede usar como una instancia de una determinada interfaz (qué interfaz se especifica a continuación, lo nombremos primero) y se puede pasar como parámetros y luego el método lo llama. Ahora echemos un vistazo a cómo generar una clase de proxy.
La copia del código es la siguiente:
Public static Object NewProxyInstance (ClassLoader Loader, Clase <?> [] Interfaces, InvocationHandler H)
Lanza ilegalargumentException
Explique los parámetros. es una interfaz, y se genera recientemente. En la matriz, y la llamada mencionada en el párrafo anterior es que el problema de la falla también es claro. El tercer parámetro, InvocationHandler, se entiende mejor, es decir, siempre que se llame cualquier método en la clase proxy, se notificará a Invocathandler. El código completo se escribe a continuación:
La copia del código es la siguiente:
clase tu {
Public void Work () {
int yoMoney = 10;
Peldar Peldarproxy = (Peldar) proxy.newproxyInstance (getClass (). GetClassLoader (), nueva clase [] {Peldar.class}, MinVocationHandler);
int meat = Peldarproxy.BuyMeat (YouMoney);
System.out.println ("Cocine la carne, peso:" + carne);
}
InvocationHandler MinVocationHandler = new InvocationHandler () {
@Anular
Public Object Invoke (Object Butcher, Method BuyMeat, Object [] Args)
lanza tirarse {
Agricultor = nuevo agricultor ();
int meat = (entero) buymeat.inboke (agricultor, args);
carne += 5;
Devolver carne;
}
};
}
interfaz Peldar {
int buymeat (int dinero);
}
El agricultor de clase implementa Peldar {
@Anular
public int buymeat (int dinero) {
int carne = 0;
// ... carne = ***;
carne de regreso;
}
}
Aquí, se genera una clase de proxy en la clase You.