- Баллы
- 76
- Имя в Minecraft
- CatCoder
Дарова всем!
В этом стартапе я расскажу (и покажу) как можно переопределить интерфейсы или абстрактные классы с помощью Dynamic Proxy Class API.
Что это такое?
Ну давайте начнем с того, что такое прокси. Прокси - это в нашем случае посредник между объектом и методом, он обрабатывает вызов определенного метода и возвращает собственные данные.
Чем оно мне пригодится?
К примеру тот же NMS, для получения более гибкого контроля энтити (или других классов, нуждающихся в переопределении) вы переопределяете его по старинке. Соответственно вы уже используете импорты NMS-классов, но вы жестокий, и хотите чтобы этот самый класс мог работать с разными версиями ядра. И что же делать? Создавать over-много классов, переопределяющих NMS-класс с разных версий? Скорее всего Вы так и сделаете. Но, создав прокси, Вы получаете один универсальный класс, который будет работать на многих версиях ядра.
Использование
Для начала мы должны создать класс для обработки методов, который реализует класс InvocationHandler. На примере я покажу реализацию прокси обычного интерфейса.
1) Создаем простой интерфейс:
2) Создаем класс-обработчик:
3) Тестируем наш код:
В итоге мы получаем это:
Думаю хоть кому-то этот стартап оказался полезным. Вскоре буду добавлять еще примеры (в том числе и над NMS-классами) Также, есть отдельные библиотеки для работы с прокси, о них мы поговорим в последующих стартапах. Удачи
В этом стартапе я расскажу (и покажу) как можно переопределить интерфейсы или абстрактные классы с помощью Dynamic Proxy Class API.
Что это такое?
Ну давайте начнем с того, что такое прокси. Прокси - это в нашем случае посредник между объектом и методом, он обрабатывает вызов определенного метода и возвращает собственные данные.
Чем оно мне пригодится?
К примеру тот же NMS, для получения более гибкого контроля энтити (или других классов, нуждающихся в переопределении) вы переопределяете его по старинке. Соответственно вы уже используете импорты NMS-классов, но вы жестокий, и хотите чтобы этот самый класс мог работать с разными версиями ядра. И что же делать? Создавать over-много классов, переопределяющих NMS-класс с разных версий? Скорее всего Вы так и сделаете. Но, создав прокси, Вы получаете один универсальный класс, который будет работать на многих версиях ядра.
Использование
Для начала мы должны создать класс для обработки методов, который реализует класс InvocationHandler. На примере я покажу реализацию прокси обычного интерфейса.
1) Создаем простой интерфейс:
JavaScript:
public interface SomeInterface {
String getFoo();
void setFoo(String foo);
}
2) Создаем класс-обработчик:
JavaScript:
public class ProxyHandler implements InvocationHandler {
private String foo;
public static SomeInterface create() {
return (SomeInterface) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
new Class[]{SomeInterface.class}, new ProxyHandler());
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
System.out.println("Invoke " + methodName);
switch (methodName) {
case "setFoo":
this.foo = args[0] + "are amazing!";
return null;
case "getFoo":
return foo;
}
return null;
}
}
3) Тестируем наш код:
JavaScript:
SomeInterface someInterface = ProxyHandler.create();
someInterface.setFoo("Dynamic Proxy Classes ");
System.out.println(someInterface.getFoo());
В итоге мы получаем это:
Код:
Invoke setFoo
Invoke getFoo
Dynamic Proxy Classes are amazing!
Думаю хоть кому-то этот стартап оказался полезным. Вскоре буду добавлять еще примеры (в том числе и над NMS-классами) Также, есть отдельные библиотеки для работы с прокси, о них мы поговорим в последующих стартапах. Удачи

.
.