你好吗?我正在尝试执行一些动态方法调用以获取 Java (Android) 中各种对象的 sql 字符串,但我对性能和稳定性有一些疑问。上下文示例:存储库类 onCreate 方法获取所有实体对象(表)并调用方法(例如 getCreateTable)以获取要执行的 sql 字符串。当然,我可以逐个类显式调用每个方法,但我还有其他调用,如“dropTables”、“truncateTables”等,我不想一直重复相同的结构。public void CreateTables() { execute(Entity1.getCreateTable()); execute(Entity2.getCreateTable()); execute(Entity3.getCreateTable()); [..] execute(Entity50.getCreateTable());}public void DropTables() { execute(Entity1.getDropTable()); execute(Entity2.getDropTable()); execute(Entity3.getDropTable()); [..] execute(Entity50.getDropTable());}直到现在我知道我可以通过 3 种不同的方式做到这一点。1)使用反射(目前正在使用):基本上,我将所有对象类存储在一个列表中,然后使用反射来调用所需的静态方法。但我知道反射并不总是应该是首选。private final List<Class> entityList = new ArrayList<Class>() { { add(Entity1.class); add(Entity2.class); add(Entity3.class); }};public void createTables() { /* get all query strings */ List<String> queryList = getQueryList("createTable"); try { for (String query : queryList) { execute(query); } } catch (SQLException e) { [...] }}private List<String> getQueryList(String methodName) { List<String> queryList = new ArrayList<>(); for (Class<?> objectClass : entityList) { try { Method[] ms = objectClass.getMethods(); for (Method me : ms) { if (me.getName().equals(methodName)) { String query = (String) me.invoke(null); if (query != null && query.length() > 0) { queryList.add((String) me.invoke(null)); } break; } } } catch (Exception e) { [...] } } return queryList;}2)在列表中存储对象实例:我可以有一个包含实例化对象的列表,然后转换为抽象父类(或接口)并调用方法来获取 sql 字符串。在这种情况下,我不知道在内存中保留实例对象列表是否是一个好习惯,也许这可能比根据列表大小使用反射更糟糕。3) 将所有字符串存储到 JSON 对象中:我还没有测试过那个,但我确定应该可以。我可以调用“init”方法来遍历所有对象并使用所有 sql 字符串(删除、创建、截断等)创建该 JSON 对象/数组。如果您能与我分享您对这些方法(优缺点)或其他更好解决方案的看法,我将不胜感激。
1 回答
30秒到达战场
TA贡献1828条经验 获得超6个赞
正如评论中所指出的,这显然是一个糟糕的设计(这是一个我正在重构的旧项目)。所以我决定摆脱反思,花一些时间重新设计代码本身。
我创建了一个基超类来处理所有类似的方法,并让实体/模型仅实现所需的单独规则,因此数据库访问仅作为单例存储在一个类中。使用接口多态性要好得多。
通过这种方式,db 类处理动态 SQL 生成以避免在各处重复相同的代码并重新使用/回收实例列表以提高性能。
观察。1:反射会降低性能,通常会让调试变得更加困难。当然它可以节省一些时间,因为它实现起来很快,但是会禁用大部分 IDE 功能,这使得它在大多数情况下毫无价值。
观察。2:也不应该保持数据库实例列表处于活动状态。让许多实例同时访问数据库绝不是一个好主意,它会导致数据库锁定并重现意外问题。
观察。3:那个 JSON 的东西……算了吧。我很抱歉提出如此丑陋的建议。
添加回答
举报
0/150
提交
取消