Прокси-классы чрезвычайно полезны, когда вы имеете дело с кодом от других команд или третьих лиц, и их можно использовать для всех видов диагностики или расширенных операций.
Я использовал их с поставщиком баз данных JDB C Банки соединений и отказоустойчивые вызовы удаленного сервера, когда прокси-сервер обрабатывает ошибки или повторные соединения, а журнал приложений c чище.
Ваш TraceHandler может быть автономным классом, добавив метод:
@SuppressWarnings("unchecked")
public static <T> T create(final T impl, final Class<?>... interfaces)
{
final Class<?> cls = impl.getClass();
return (T)Proxy.newProxyInstance(cls.getClassLoader(), interfaces, new TraceHandler(impl));
}
Затем вы можете использовать TraceHandler для мониторинга / регистрации ЛЮБОГО интерфейса, используемого вашим приложением:
SomeObject x = TraceHandler.create(x, SomeObject.class);
FileVisitor myvisitor = TraceHandler.create(visitor, FileVisitor.class)
Надеюсь, тогда станет яснее, чем могут быть полезны прокси-классы, и следующий пример:
public class ProxyTest
{
public static void main(String[] args) {
var elements = new Integer[1000];
for (int i = 0; i < elements.length; i++) {
elements[i] = Integer.valueOf(i);
}
// construct a random integer
Integer key = new Random().nextInt(elements.length) + 1;
Comparator<Integer> comparator = Integer::compare;
Comparator<Integer> comparator2 = TraceHandler.create(comparator, Comparator.class);
// search for the key
System.out.println("Search for "+key+" without proxy:");
int result = Arrays.binarySearch(elements, key, comparator);
// print match if found
if (result >= 0)
System.out.println(elements[result]);
System.out.println("Search "+key+" with proxy:");
int result2 = Arrays.binarySearch(elements, key, comparator2);
if (result2 >= 0)
System.out.println(elements[result]);
}
}