Как вызвать метод во время выполнения для динамического объекта? - PullRequest
0 голосов
/ 17 апреля 2019

Моя проблема очень проста: мы можем вызывать методы класса во время выполнения, не используя отражения специально во время выполнения, в ситуации, когда нам приходится загружать тонны данных из базы данных, используя ORM, но в объектно-ориентированной форме вместо raw ResultSet.

Теперь ORM, используемый моей организацией, является проприетарным, и что я видел в его коде, что для загрузки данных в POJO из базы данных он использует отражение для установки значений полей, вызывая методы getters & setters, как показано ниже фрагмент кода (это типично решение и большинство ORM следуют так же)

// somewhere inside my ORM
Object obj = pojo.newInstance();// pojo a Class instance wrapping up original POJO mapping of Table in db

Class type =pojo.getMethod("get"+StringUtils.capitalize(fieldName),Class[0]).getReturnType();

Method m = pojo.getMethod("set"+StringUtils.capitalize(fieldName), new Class[] { paramType });

m.invoke(obj, new Object[] { value });

Теперь здесь основная проблема связана с getMethod класса Class, если мы проверим его реализацию внутри rt.jar, то где-нибудь мы найдем код ниже в Class.class (в rt.jar)

  private static Method searchMethods(Method[] methods,
                                        String name,
                                        Class<?>[] parameterTypes)
    {
        Method res = null;
        String internedName = name.intern();
        for (int i = 0; i < methods.length; i++) {
            Method m = methods[i];
            if (m.getName() == internedName
                && arrayContentsEq(parameterTypes, m.getParameterTypes())
                && (res == null
                    || res.getReturnType().isAssignableFrom(m.getReturnType())))
                res = m;
        }

        return (res == null ? res : getReflectionFactory().copyMethod(res));
    }

это searchMethods, который вызывается getMethod изнутри, чтобы найти метод объекта.

Это нагрузка на производительность, потому что если у нас есть 80 полей в pojo, то у нас есть почти 80 геттеров и 80 сеттеров, и в худшем случае приходится сравнивать массив методов для сравнения 160 раз (80 для геттеров и 80 для сеттеров)

Теперь, если мне нужно выбрать 6 полей, он должен сканировать массив методов 12 раз для получения и установки, а если я выберу 20 полей, то также и так далее.

now how to solve this performance issue while maintaining 3 key points
 1. Performance (in terms of iterations)
 2. Less memory usage 
 3. Re-usability

В JPA мы должны создавать различные DTO согласно требованию, например, если у нас есть требование 6 полей на одной стороне обзора, тогда мы должны создать конструктор, имеющий 6 полей в качестве параметров, и если нам нужно 20, мы должны создать любой новый конструктор, имеющий 20 полей в одном и том же DTO, или мы должны создать полностью новое DTO с этими 20 полями, в то время как в вышеприведенном подходе конструктор не требуется, новый класс не требуется, и при вызове метода POJO используется везде, начиная с динамического выбора поля для обновления определенных полей.

Теперь я не хочу создавать несколько DTO или несколько конструкторов внутри POJO, вместо этого я хочу вызвать getter & setters без снижения производительности моей инициализации объекта через отражение.

Так есть ли другой способ, с помощью которого мы можем на лету вызывать методы получения и установки POJO без отражения во время выполнения, особенно в случае использования API ORM? Таким образом, я должен продолжать использовать свой существующий ORM, а не переключаться на Hibernate + JPA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...