Напомните пожалуйста когда нас учили public <T extends Item> T getProxy(Class<T> classType, Class... interfaces)
и тому -
System.arraycopy(interfaces, 0, interfacesArray, 1, interfaces.length);
Допустим я изучая когда-то цепочку лекций про Дженерики (не углубился изучением <T extends Item>
Но спустя х...у кучу задачек не помню чтоб делал так System.arraycopy(, , , ,);
З.Ы 1-Ая задача про Создание прокси-объекта ГУД!!
Использование динамического прокси в Java обычно сводится к нескольким основным этапам:
1. Определение интерфейса: Динамический прокси в Java работает на основе интерфейсов. Вы должны определить интерфейс, который будет реализован динамическим прокси.
2. Создание обработчика вызовов (Invocation Handler): Обработчик вызовов – это объект, реализующий интерфейс java.lang.reflect.InvocationHandler. В этом объекте вы определяете логику, которая будет выполняться при вызове метода прокси.
3. Создание прокси: Прокси создается с помощью статического метода java.lang.reflect.Proxy.newProxyInstance(). Этому методу передаются загрузчик классов, интерфейсы, которые должен реализовать прокси, и обработчик вызовов.
import java.lang.reflect.*;
// 1. Определение интерфейса
interface MyInterface {
void myMethod();
}
class MyObject implements MyInterface {
public void myMethod() {
System.out.println("Original method");
}
}
// 2. Создание обработчика вызовов
class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before original method");
Object result = method.invoke(target, args);
System.out.println("After original method");
return result;
}
}
public class Main {
public static void main(String[] args) {
// Оригинальный объект
MyInterface original = new MyObject();
// 3. Создание прокси
MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class[] {MyInterface.class},
new MyInvocationHandler(original)
);
proxy.myMethod(); // Выведет "Before original method", затем "Original method", затем "After original method"
}
}
В этом примере при вызове proxy.myMethod() вместо непосредственного вызова оригинального метода вызывается метод invoke() обработчика вызовов. Внутри invoke() вызывается оригинальный метод, и перед и после этого выводятся сообщения.
хз, решил с первого раза и все понял после прочтения вот этой статьи тык
навряд ли конечно эта та вещь, которой будешь пользоваться каждый день, но знать и понимать точно нужно
Во второй задаче обратите внимание на слово дополнительных интерфейсов, т.е. аргументом должны быть не только одни они.
И еще валик пропускает без дженериков, только в правильном решении увидел, что ожидается решение с ними.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ