你好吗?我正在尝试执行一些动态方法调用以获取 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 对象/数组。
如果您能与我分享您对这些方法(优缺点)或其他更好解决方案的看法,我将不胜感激。
30秒到达战场
相关分类