Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем CatCoder, 4 июл 2017.

  1. Автор темы
    CatCoder

    CatCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CatCoder
    Дарова всем!

    В этом стартапе я расскажу (и покажу) как можно переопределить интерфейсы или абстрактные классы с помощью
    Dynamic Proxy Class API
    .

    Что это такое?
    Ну давайте начнем с того, что такое прокси. Прокси - это в нашем случае посредник между объектом и методом, он обрабатывает вызов определенного метода и возвращает собственные данные.

    Чем оно мне пригодится?
    К примеру тот же NMS, для получения более гибкого контроля энтити (или других классов, нуждающихся в переопределении) вы переопределяете его по старинке. Соответственно вы уже используете импорты NMS-классов, но вы жестокий, и хотите чтобы этот самый класс мог работать с разными версиями ядра. И что же делать? Создавать over-много классов, переопределяющих NMS-класс с разных версий? Скорее всего Вы так и сделаете. Но, создав прокси, Вы получаете один универсальный класс, который будет работать на многих версиях ядра.

    Использование
    Для начала мы должны создать класс для обработки методов, который реализует класс InvocationHandler. На примере я покажу реализацию прокси обычного интерфейса.

    1) Создаем простой интерфейс:
    Код:
    public interface SomeInterface {
    
        String getFoo();
    
        void setFoo(String foo);
    }

    2) Создаем класс-обработчик:
    Код:
    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) Тестируем наш код:
    Код:
            SomeInterface someInterface = ProxyHandler.create();
            someInterface.setFoo("Dynamic Proxy Classes ");
            System.out.println(someInterface.getFoo());

    В итоге мы получаем это:
    Код:
    Invoke setFoo
    Invoke getFoo
    Dynamic Proxy Classes are amazing!
    Думаю хоть кому-то этот стартап оказался полезным. Вскоре буду добавлять еще примеры (в том числе и над NMS-классами) Также, есть отдельные библиотеки для работы с прокси, о них мы поговорим в последующих стартапах. Удачи ;)
     
  2. Хостинг MineCraft
    <
  3. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    hyndo
    Годно
     
  4. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Я много чего видел, но такой костыль для рефлекии впервые :D.
     
  5. CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
  6. Автор темы
    CatCoder

    CatCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CatCoder
    В жабке полно тайн :).
     

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