如何在运行时为动态对象调用方法?

问题描述 投票:0回答:1

我的问题很简单,在某些情况下,例如我们必须使用ORM而是从面向对象的形式而不是原始的方式从数据库中加载大量数据,我们可以在运行时调用类的方法而无需在运行时专门使用反射结果集。

现在我的组织使用的ORM是专有的,我在其代码中看到的将数据从数据库加载到POJO的过程是,它使用反射通过调用以下代码段的getter和setter方法来设置字段的值(这是典型的解决方案和大多数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 });

现在这里的主要问题是Class类的getMethod,如果我们在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在内部调用以查找对象的方法。

这是一个性能负担,因为如果在pojo中有80个字段,那么我们将有近80个getter和80 setter,在最坏的情况下,它必须迭代方法数组以进行比较160次(getter的80和setter的80)]

[现在如果我必须选择6个字段,那么它必须扫描方法数组12次以获取吸气剂和设置器,如果我确实选择了20个字段,则依此类推。

现在如何在保持3个关键点的同时解决此性能问题1.性能(根据迭代)2.更少的内存使用3.可重用性

在JPA中,我们必须根据需求创建不同的DTO,例如如果我们在视图的一侧有6个字段,那么我们必须创建具有6个字段作为参数的构造函数,如果我们需要20个,我们必须创建具有20个字段的新构造函数相同的DTO中的字段,或者我们必须使用这20个字段创建整个新的DTO,而在上述方法中,不需要构造函数,不需要新的类,并且通过方法调用POJO被用于从动态文件选择到更新特定字段的所有地方。

现在,我不想在POJO中创建多个DTO或多个构造函数,而是想调用getter和setter方法,而又不会通过反射降低对象初始化的性能。

所以还有另一种方法可以在运行时调用POJO的快速getter和setter方法而无需在运行时进行反射,特别是在ORM API的用例中?通过此操作,我必须继续使用现有的ORM,而不要切换到Hibernate + JPA

我的问题很简单,我们可以在运行时调用类的方法,而不必在运行时专门使用反射,例如,必须使用...从数据库中加载大量数据的情况。

java hibernate reflection orm byte-buddy
1个回答
0
投票

您可能想看看ReflectASM

© www.soinside.com 2019 - 2024. All rights reserved.