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

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

Discussion in 'Разработка плагинов для новичков' started by CatCoder, Jul 4, 2017.

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    CatCoder
    Дарова всем!

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

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

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

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

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

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

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

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

    Trophy Points:
    66
    Имя в Minecraft:
    hyndo
    Годно
     
  4. alexandrage

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

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

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

    Trophy Points:
    108
    Имя в Minecraft:
    CraftCoderr
  6. Автор темы
    CatCoder

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

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

Share This Page