Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Динамические прокси классов (переопределяем интерфейсы)

CatCoder

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
CatCoder
Дарова всем!

В этом стартапе я расскажу (и покажу) как можно переопределить интерфейсы или абстрактные классы с помощью
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-классами) Также, есть отдельные библиотеки для работы с прокси, о них мы поговорим в последующих стартапах. Удачи ;)
 

Поделиться этой страницей

Назад
Верх