Перебор классов со статическими функциями - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть класс модели, подобный этому

class ModelName {
    public static void createTable(SQLiteDatabase db){
        // code to create Table in DB
    }

    public static void deleteTable(SQLiteDatabase db){
        // code to delete Table from DB
    }
}

У каждого класса есть эти статические функции createTable, deleteTable
Я бы хотел перебрать классы следующим образом:

SQLiteDatabase db_object = ....; //init the object
Class<?>[] models = {ModelName, OtherModelName};
for(Class<?> model : models){
    model.deleteTable(db_object);
}

Но определить интерфейс для public static void невозможно, и у меня нет причин создавать экземпляры

Как этого добиться?
Не могу найти подходящих слов для описания моей идеи

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Не знаю, ищите ли вы это, но я только что проверил это следующим образом.

Классы:

class ModelName {
    public static void createTable(SQLiteDatabase db){
        System.out.println(Thread.currentThread().getStackTrace()[1]);
    }

    public static void deleteTable(SQLiteDatabase db){
        System.out.println(Thread.currentThread().getStackTrace()[1]);
    }
}

class OtherModelName {
    public static void createTable(SQLiteDatabase db){
        System.out.println(Thread.currentThread().getStackTrace()[1]);
    }

    public static void deleteTable(SQLiteDatabase db){
        System.out.println(Thread.currentThread().getStackTrace()[1]);
    }
}

Основной код:

Class<?>[] models = {ModelName.class, OtherModelName.class};

for(Class<?> model : models){
    Method method = model.getMethod("createTable", SQLiteDatabase.class);
    method.invoke(null, new SQLiteDatabase());
    method = model.getMethod("deleteTable", SQLiteDatabase.class);
    method.invoke(null, new SQLiteDatabase());
}

Вывод:

demo.reflection.ModelName.createTable(IterateClassStaticMethod.java:12)
demo.reflection.ModelName.deleteTable(IterateClassStaticMethod.java:16)
demo.reflection.OtherModelName.createTable(IterateClassStaticMethod.java:22)
demo.reflection.OtherModelName.deleteTable(IterateClassStaticMethod.java:26)

Примечание. Для меня это выглядит более затратно, чем просто создание экземпляров.Кроме того, код выглядит менее читабельным и управляемым, как этот.

1 голос
/ 30 ноября 2011

Попробуйте это (не проверено):

for(Class<?> model : models){
    model.getMethod("deleteTable",SQLiteDatabase.class).invoke(null,db_object);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...