Класс Java Dynamic Proxy расположен в пакете java.lang.reflect и, как правило, в основном включает в себя следующие два класса:
(1) InvocationHandler: в этом интерфейсе определяется только один метод
Public Object Invoke (объект obj, метод метода, объект [] args)
В фактическом использовании первый параметр OBJ обычно относится к классу прокси, метод - это метод прокси, такой как запрос () В приведенном выше примере ARGS является массивом параметров метода. Этот абстрактный метод реализуется динамически в классе прокси.
(2) Прокси: этот класс представляет собой динамический класс прокси, и его функция аналогична проксисубъектуру в приведенном выше примере, который в основном содержит следующее содержание, защищенное прокси (volcocationHandler H): конструктор, используемый для назначения значений Внутренний ч.
Статический класс getProxyClass (ClassLoader Loader, класс [] интерфейсы)
Получите класс прокси, где загрузчик является загрузчиком класса, а интерфейсы - это массив всех интерфейсов, принадлежащих реальному классу.
Статический объект NewProxyInstance (ClassLoader Loader, интерфейсы класса [], vococationHandler h)
Возвращает экземпляр прокси -класса.
Так называемый динамический прокси-это класс: это класс, сгенерированный во время выполнения. Конечно, вы можете использовать экземпляр класса в качестве любого из этих интерфейсов. Конечно, этот динамичный прокси на самом деле является прокси, который не будет выполнять существенную работу для вас.
При использовании классов динамических прокси мы должны реализовать интерфейс InvocationHandler:
Смотрите субъект программы. Java
Смотрите программу RealSubject.java
Смотрите программу DynamicSubject.java
Смотрите программу client.java
Кода -копия выглядит следующим образом:
пакет com.langsin.dynamicproxy;
// абстрактная роль (ранее это был абстрактный класс, его следует изменить на интерфейс здесь):
Общественный интерфейс субъект
{
Аннотация Public void запрос ();
}
Кода -копия выглядит следующим образом:
пакет com.langsin.dynamicproxy;
// конкретная роль
публичный класс RealSubject реализует субъект
{
public RealSubject ()
{
}
Public void запрос ()
{
System.out.println («От реального субъекта.»);
}
}
Кода -копия выглядит следующим образом:
пакет com.langsin.dynamicproxy;
импортировать java.lang.reflect.invocationHandler;
импортировать java.lang.reflect.method;
// Прокси -процессор
/**
* Внутренние свойства класса прокси представляют собой объектный класс.
* Кроме того, метод Invoke также реализован в этом классе, Method.invoke (sub, args);
* На самом деле, он должен вызвать метод, который будет выполняться объектом прокси.
* ARGS - это параметр, необходимый для выполнения соответствующей работы объекта прокси.
* Через динамические прокси -классы мы можем выполнить некоторые связанные операции до или после вызова
*/
Общедоступный класс DynamicsUbject реализует vocationHandler
{
частный объект Sub;
public dynamicsUbject ()
{
}
Public DynamicsUbject (объект obj)
{
sub = obj;
}
Общественный объект invoke (объект прокси, метод метода, объект [] args) бросает бросание
{
System.out.println («Перед вызовом» + метод);
method.invoke (sub, args);
System.out.println ("после вызова" + метод);
вернуть ноль;
}
}
Кода -копия выглядит следующим образом:
пакет com.langsin.dynamicproxy;
импортировать java.lang.reflect.invocationHandler;
Импорт java.lang.reflect.proxy;
// клиент
клиент открытого класса
{
Статическая публичная void main (String [] args) бросает бросание
{
RealSubject rs = newsubject ();
VocationHandler ds = new DynamicSUbject (RS);
Класс <?> Cls = rs.getClass ();
// следующее приведено агент одноразового поколения
Субъект = (субъект) proxy.newproxyinstance (
cls.getclassloader (), cls.getInterfaces (), ds);
субъект.request ();
}
}
Пример 2:
Кода -копия выглядит следующим образом:
пакет com.langsin.dynamicproxy;
импортировать java.lang.reflect.invocationHandler;
импортировать java.lang.reflect.method;
Импорт java.lang.reflect.proxy;
импортировать java.util.list;
импортировать java.util.vector;
Общедоступный класс VectorProxy реализует upocationHandler
{
частный объект ProxyObj;
Public VectorProxy (Object obj) {
ProxyObj = obj;
}
Public Static Object Factory (Object obj) {
Класс <?> Cls = obj.getClass ();
return proxy.newproxyinstance (cls.getclassloader (), cls.getInterfaces (), new VectorProxy (obj));
}
открытый объект invoke (proxy объекта, метод метода, Object [] args) бросает Throwable {
System.out.println («Перед вызовом» + метод);
if (args! = null) {
для (int i = 0; i <args.length; i ++) {
System.out.println (args [i] + "");
}
}
Объект объекта = method.invoke (proxyobj, args);
System.out.println ("после вызова" + метод);
вернуть объект;
}
@Suppresswarnings ("не контролировано")
public static void main (string [] args) {
List <string> v = (list <string>) Factory (новый Vector <string> (10));
v.add ("new");
V.Add ("York");
System.out.println (v);
v.remove (0);
System.out.println (v);
}
}
Пример 3.
Кода -копия выглядит следующим образом:
пакет com.langsin.dynamicproxy;
публичный интерфейс foo {
void doAction ();
}
пакет com.langsin.dynamicproxy;
открытый класс Fooimpl реализует foo {
public fooimpl () {
}
public void doAction () {
System.out.println ("in fooimp1.doaction ()");
}
}
пакет com.langsin.dynamicproxy;
открытый класс fooimpl2 реализует foo {
public fooimpl2 () {
}
public void doAction () {
System.out.println ("in fooimp2.doaction ()");
}
}
пакет com.langsin.dynamicproxy;
импортировать java.lang.reflect.invocationHandler;
импортировать java.lang.reflect.method;
открытый класс CommonInVocationHandler реализует vococationHandler {
// динамическое выполнение объектов, объектов, которые требуют обратных вызовов
Цель частного объекта;
// Поддержка инъекции конструктора
public commonInVocationHandler () {
}
// Поддержка инъекции конструктора
public commonInVocationHandler (объект цели) {
Settarget (Target);
}
/**
*
* Используйте метод сеттера для внедрения
*
* @param target
*
*/
public void settarget (объект цели) {
this.Target = target;
}
/**
*
* Вызовите метод, указанный в прокси и пройти в списке параметров ARGS
*
* @param Proxy
* Тип класса прокси, такой как определение интерфейса прокси, соответствующего методу
*
* @param Метод
* Метод получения доверенности
*
* @param args
* Параметры, которые вызывают метод прокси -сервера
*
* @возвращаться
*
* @throhs java.lang.trowable
*
*/
открытый объект invoke (proxy объекта, метод метода, Object [] args) бросает Throwable {
method return.invoke (target, args);
}
}
пакет com.langsin.dynamicproxy;
Импорт java.lang.reflect.proxy;
демо открытого класса {
public static void main (string [] args) {
// 1. Общая динамическая реализация прокси -сервера
CommonInInVocation Handler Handler = новый CommonInvocationHandler ();
Foo f;
// 2. Реализация интерфейса 1
handler.settarget (new fooimpl ());
// Метод Параметр Описание: Класс прокси, список реализации класса прокси, Прокси -процессор класса прокси.
// Свяжится класс прокси, методы интерфейса и процессоры в классе прокси.
// Если класс прокси не реализует указанный список интерфейсов, будет брошено незаконное исключение параметров
f = (foo) proxy.newproxyinstance (foo.class.getClassloader (),
новый класс [] {foo.class},
обработчик);
f.doaction ();
// 3. Реализация интерфейса 2
handler.settarget (new fooimpl2 ());
f = (foo) proxy.newproxyinstance (foo.class.getClassloader (),
новый класс [] {foo.class},
обработчик);
f.doaction ();
}
}
Поскольку у меня есть ограниченный литературный талант, большая часть контента - это код