2011-11-30 47 views
3

我Model類這樣通過靜態函數的類迭代

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 
    } 
} 

每類有這些靜態函數createTabledeleteTable
我想通過類這樣的迭代:

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

但是爲public static void定義接口是不可能的,我沒有理由創建實例

如何做到這一點?
真的不能找到合適的詞語來形容我的想法

+1

http://stackoverflow.com/a/287654/106261 – NimChimpsky

+2

「我沒有理由創建實例」 - 這看起來像是一個原因,如果你想避免反射。 –

+0

我不想避免反思,只是忘記了它的存在:D –

回答

1

我不知道如果這是你在找什麼,但我只是測試它以下。

類:

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) 

注:對我來說,這看起來像不僅僅是創建實例更多的開銷。而且,代碼的可讀性和可管理性如此。

+0

是的,確切地說。謝謝 –

+0

@MarekSebera:不客氣。 –

1

試試這個(未經測試):

for(Class<?> model : models){ 
    model.getMethod("deleteTable",SQLiteDatabase.class).invoke(null,db_object); 
}