【问题标题】:Iterating through classes with static functions使用静态函数遍历类
【发布时间】:2011-11-30 16:31:51
【问题描述】:

我有这样的模型类

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定义接口是不可能的,我没有理由创建实例

如何做到这一点?
实在找不到合适的词来形容我的想法

【问题讨论】:

  • “我没有理由创建实例” - 如果您想避免反射,这看起来是一个原因。
  • 我不想避免反思,只是忘记了它的存在:D

标签: java class interface


【解决方案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)

注意:在我看来,这比创建实例的开销更大。此外,这样的代码看起来不太可读和可管理。

【讨论】:

    【解决方案2】:

    试试这个(未经测试):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2018-03-19
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多