Назначение
Является суррогатом другого объекта и контролирует доступ к нему.
Использование шаблона в JDK
(примеры частично взяты с этого ресурса)
- java.lang.reflect.Proxy
- Connection Pool для JDBC - пример кэширующего прокси
----------------------------------------------------------------
-------------------java.lang.reflect.Proxy-------------------
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
public class ProxyTest {
public static void main(String[] args) {
List proxyList = wrapList(new ArrayList(), "add", "toString");
proxyList.add(10);
proxyList.add(20);
proxyList.add(30);
System.out.println(proxyList);
proxyList.remove(1);
}
private static List wrapList(final List list,
final String... allowedMethods) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(
Object proxy, Method method, Object[] args)
throws Throwable {
if (asList(allowedMethods).contains(method.getName())) {
return method.invoke(list, args);
} else {
throw new SecurityException("Access denied!");
}
}
};
return (List) Proxy.newProxyInstance(
ProxyTest.class.getClassLoader(),
new Class[]{List.class},
handler);
}
}
Является суррогатом другого объекта и контролирует доступ к нему.
Использование шаблона в JDK
(примеры частично взяты с этого ресурса)
- java.lang.reflect.Proxy
- Connection Pool для JDBC - пример кэширующего прокси
----------------------------------------------------------------
-------------------java.lang.reflect.Proxy-------------------
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
public class ProxyTest {
public static void main(String[] args) {
List proxyList = wrapList(new ArrayList(), "add", "toString");
proxyList.add(10);
proxyList.add(20);
proxyList.add(30);
System.out.println(proxyList);
proxyList.remove(1);
}
private static List wrapList(final List list,
final String... allowedMethods) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(
Object proxy, Method method, Object[] args)
throws Throwable {
if (asList(allowedMethods).contains(method.getName())) {
return method.invoke(list, args);
} else {
throw new SecurityException("Access denied!");
}
}
};
return (List) Proxy.newProxyInstance(
ProxyTest.class.getClassLoader(),
new Class[]{List.class},
handler);
}
}