有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用静态函数遍历类

我有这样的模型课

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

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


共 (2) 个答案

  1. # 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. # 2 楼答案

    试试这个(未经测试):

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