Сначала проанализируйте три роли в модели динамического прокси:
1. Абстрактная роль: в статическом прокси это может быть абстрактный класс, но в динамическом прокси это может быть только интерфейс.
2. Реальная роль: она просто реализует методы абстрактной роли.
3. Роль агента. Самое отвратительное, это роль агента в динамическом агенте. Он должен содержать ссылку на реального персонажа.
Он включает в себя интерфейс и класс, интерфейс InvoctionHandler и класс Proxy. Согласно документации JDK, интерфейс InlocationHandler реализуется классом, а экземпляром этого класса является объект-обработчик, соответствующий прокси-объекту. Когда вызывается метод прокси-объекта, этот метод будет закодирован и назначен методу вызова соответствующего вызываемого объекта-обработчика!
Скопируйте код кода следующим образом:
//Абстрактная роль:
публичный интерфейс AbstractRole
{
публичное недействительное шоу();
}
//Реальный персонаж:
публичный класс RealRole реализует AbstractRole
{
@Override
public void show(){ System.out.println("покажи мне свой дом" };
}
//Роль агента:
//Я думаю, что это просто псевдоагент. Псевдоагент я придумал сам = =! , потому что на самом деле это обработчик, соответствующий агенту
Обработчик публичного класса реализует InvoctionHandler
{
Private Object realRole // Роль прокси должна иметь ссылку на реальную роль. Если она определена как тип объекта, она является универсальной.
общедоступный обработчик (объект realRole)
{ this.realRole = RealRole }
@Override
Открытый вызов объекта (прокси-сервер объекта, метод метода, аргументы Object[])
{
System.out.println("Дайте мне свои деньги"); // Это дополнительная функция, добавляемая самой ролью агента.
метод.invoke(this.realRole, args); //Вызов метода реальной роли посредством отражения
System.out.println("ОК...дом ваш");//Это дополнительная функция, добавляемая самой ролью агента.
}
public Object Factory()//Сгенерируйте роль реального агента с помощью фабричного метода
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //Метод newProxyInstance в Proxy имеет две очень важные особенности! Первый — динамически создать прокси-класс, если на выходе получается класс с именем $Proxy0, второй — создать экземпляр через динамически созданный класс;
}
}
//Клиент:
тест публичного класса
{
public static void main(String[] args)
{
RealRole realRole = new RealRole();//Какую реальную роль вы хотите представлять, просто создайте новую реальную роль
Handler handler = new Handler(realRole);//Здесь генерируется обработчик, соответствующий прокси-классу. Я также хочу назвать его псевдо-прокси-объектом.
AbstractRole proxy = (AbstractRole)handler.factory();//Генерируем прокси-объекты с помощью фабричных методов
}
}
Вам может быть интересно, как можно принудительно преобразовать роль агента в абстрактную роль? Причина кроется в методе newProxyInstance. Этот метод слишком интересен. Как уже говорилось выше, он автоматически генерирует класс, а затем через него генерирует прокси-объект. Фактически, этот класс реализует абстрактный класс ролей. Почему? Потому что во втором параметре уже указано, какие интерфейсы он реализует. Таким образом, вы можете принудительно выполнить передачу. После принудительной передачи вы можете вызвать методы в абстрактной роли.
proxy.show();//Хорошо! Обратите внимание на это предложение. Я отметил его красным в начале: «Этот метод будет закодирован и назначен методу вызова соответствующего объекта-обработчика для вызова». передается методу вызова в объекте-обработчике. Конечно, также учитываются параметры метода show, но здесь метод show не имеет параметров. Таким образом, предложение proxy.show() фактически вызывает метод вызова в объекте-обработчике.