Все агенты знают, что когда вы идете по магазинам, есть много агентов, и они просто продают оригинальные продукты. Например, если вы хотите покупать мясо каждый день, свинья выращивается фермером, но если вы покупаете мясо у мясника, мясник может рассматриваться как агент. Тогда вам нужен агент? Свиньи, а затем забивайте их.
Как реализовать этот процесс с помощью кода: мы должны использовать три категории: мясник и фермер для обозначения вас, мясника и фермеров соответственно. Среди них фермер также предоставляет метод покупки мяса для вызова мясника.
Кода -копия выглядит следующим образом:
класс фермер {
public int buymeat (int money) {
int meat = 0;
// ... мясо = ***;
вернуть мясо;
}
}
Мясник предоставляет вам метод покупки мяса. Код заключается в следующем:
Кода -копия выглядит следующим образом:
класс мясник {
public int buymeat (int money) {
Farmer Farmer = новый фермер ();
int meat = Farmer.buymeat (деньги);
мясо += 5;
вернуть мясо;
}
}
Однако код, который вы покупаете мясо у мясника, становится таким:
Кода -копия выглядит следующим образом:
класс ты {
public void work () {
int youmoney = 10;
Мясник мясник = новый мясник (); // Найти мясника.
int meat = butcher.buymeat (youmoney);
System.out.println («Готовьте мясо, вес:» + мясо); // Вы готовили его.
}
}
Мы также можем оптимизировать эту программу. Это мясник или фермер.
Кода -копия выглядит следующим образом:
класс ты {
public void work () {
int youmoney = 10;
Пелдар Пелдар = новый мясник (); // Найти Пелдар.
int meat = peldar.buymeat (youmoney);
System.out.println («Готовьте мясо, вес:» + мясо);
}
}
интерфейс peldar {
int buymeat (int money);
}
класс мясник реализует Пелдар {
@Override
public int buymeat (int money) {
Farmer Farmer = новый фермер ();
int meat = Farmer.buymeat (деньги);
мясо += 5;
вернуть мясо;
}
}
Класс фермер реализует Пелдар {
@Override
public int buymeat (int money) {
int meat = 0;
// ... мясо = ***;
вернуть мясо;
}
}
Это прокси.
Тем не менее, это называется статическим прокси, потому что прокси -класс (класс мясника) написан вами, а динамический прокси - это динамически генерировать эквивалентный класс прокси, когда Java работает. Несмотря на то, что класс генерируется динамически, код убийства свиней и инъекции воды все еще должен быть написан, просто больше не пишите класс. Где это написать?
Кода -копия выглядит следующим образом:
публичный интерфейс vlocationhandler {
public Object invoke (Proxy объекта, метод метода, объект [] args) бросает выбрасывание;
}
Что означают параметры?
Кода -копия выглядит следующим образом:
публичный интерфейс vlocationhandler {
Общедоступный объект вызывает (объектный мясник, метод Buymeat, Object [] Money) бросает бросание;
}
Первый параметр является объектом автоматически сгенерированного класса прокси (объект класса мясника, который сгенерируется), а второй параметр - это объект метода, который вызывается (как есть метод, см. Java Механизм отражения). Таким образом, код убийства свиней и заполнения воды становится таким, когда он написан:
Кода -копия выглядит следующим образом:
VocationHandler minvocationHandler = new vocociationHandler () {
@Override
Общественный объект invoke (Object Butcher, Method Buymeat, Object [] args) бросает бросание {
Farmer Farmer = новый фермер ();
int meat = (целое число) buymeat.invoke (фермер, Args);
мясо += 5;
вернуть мясо;
}
};
Это немного несовместимо с обычным методом вызова метода покупки мяса фермера. Вы можете спросить тогда, почему бы не позвонить ему напрямую? У вас есть много объектов фермера, даже не объекты фермера, могут использоваться в качестве экземпляра определенного интерфейса (который интерфейс указан ниже, давайте сначала назову его) и может быть передано в виде параметров, а затем метод вызывает его. Теперь давайте посмотрим, как генерировать класс прокси.
Кода -копия выглядит следующим образом:
Public Static Object NewProxyInstance (ClassLoader Loader, класс <?> [] Интерфейсы, InvocationHandler h)
бросает allogalargumentException
Объясните параметры. это интерфейс, и он вновь сгенерирован, агент будет реализовать все эти интерфейсы. В массиве, и вызов, упомянутый в предыдущем абзаце, является проблемой сбоя также является ясной. Третий параметр, InvocationHandler, лучше понят, то есть до тех пор, пока любой метод в классе прокси -класса называется, invocationHandler будет уведомлен. Полный код написан ниже:
Кода -копия выглядит следующим образом:
класс ты {
public void work () {
int youmoney = 10;
Peldar peldarproxy = (peldar) proxy.newproxyinstance (getClass (). GetClassloader (), новый класс [] {peldar.class}, minvocationHandler);
int meat = peldarproxy.buymeat (youmoney);
System.out.println («Готовьте мясо, вес:» + мясо);
}
VocationHandler minvocationHandler = new vocociationHandler () {
@Override
Общественный объект invoke (Object Butcher, Method Buymeat, Object [] args)
бросает бросок {
Farmer Farmer = новый фермер ();
int meat = (целое число) buymeat.invoke (фермер, Args);
мясо += 5;
вернуть мясо;
}
};
}
интерфейс peldar {
int buymeat (int money);
}
Класс фермер реализует Пелдар {
@Override
public int buymeat (int money) {
int meat = 0;
// ... мясо = ***;
вернуть мясо;
}
}
Здесь прокси -класс генерируется в классе You.