Моя проблема очень проста: мы можем вызывать методы класса во время выполнения, не используя отражения специально во время выполнения, в ситуации, когда нам приходится загружать тонны данных из базы данных, используя 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