首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从一个包含多个java源文件的包中动态执行多个类的函数?

如何从一个包含多个java源文件的包中动态执行多个类的函数?
EN

Stack Overflow用户
提问于 2014-05-13 00:20:25
回答 1查看 85关注 0票数 0

我正在尝试创建一个java应用程序,它将运行很长时间。在该java应用程序中,将有一个包,其中将有多个java文件。类的名称将与java文件的名称相同。并且所有的类都将包含2-3个函数(每个类的函数的固定名称),但是它们的定义将从一个java文件更改为另一个。

那么我该怎么做呢?我已经有的一个解决方案是使用java反射。但是我不想使用java反射来实现它。在我的项目中,我确实对此有一个限制。

请帮帮我。请提供您的宝贵意见。

EN

回答 1

Stack Overflow用户

发布于 2014-05-13 01:43:55

我不确定您需要什么样的动态级别,但您可以使用接口,其他类实现它

代码语言:javascript
复制
Interface MainClass{
    public void method1(int param1);
    public void method2(String param1);
    public void method3();
}

Class Sub1 implements MainClass{

    public void method1(int param1){
    //blah blah blah
    }
    public void method2(String param1){
    //blah blah blah
    }

    public void method3(){
    //blah blah blah
    }

}

Class Sub2 implements MainClass{

    public void method1(int param1){
    //blah blah blah
    }
    public void method2(String param1){
    //blah blah blah
    }

    public void method3(){
    //blah blah blah
    }
}

Class SubN implements MainClass{

    public void method1(int param1){
    //blah blah blah
    }
    public void method2(String param1){
    //blah blah blah
    }

    public void method3(){
    //blah blah blah
    }
}

Class Starter{

    private Sub1 s1 = new Sub1();
    private Sub2 s2 = new Sub1();
    private Sub3 sn = new Sub1();


    s1.method1(12);
    s2.method2("OK");
    //blah blah blah
}

#####EDIT /更新

这就是我所说的starter-target sol,目标是您想要运行的50或100个类,而starter是将实例化所有类并调用内部方法的类。

这里的想法是,starter类是自动生成的,自动编译,然后作为一个普通的类,实例化并使用。

查找样本完整溶胶:

代码语言:javascript
复制
class Generator{
    public boolean generateStarter(String classesPath, String writePath){
        File classes = new File(classesPath);
        String allClasses[] = classes.list();
        StringBuilder str = new StringBuilder();
        str.append("Class Starter {\n");
        str.append("public void go(){\n");

        String tmpVarName = "";
        for(int a=0;a<allClasses.length;a++){
            //XXX var1 = new XXX();
            tmpVarName = generateVariableName();
            str.append(getClassName(allClasses[a]) + " " + tmpVarName + " = new " + getClassName(allClasses[a]) + "();\n");
            str.append(tmpVarName + ".method1();\n");//as method names are known and fixed...
            str.append(tmpVarName + ".method2();\n");//as method names are known and fixed...

            str.append(tmpVarName + ".methodN();\n\n");//as method names are known and fixed...
        }//for loop
        str.append("}//go()\n");
        str.append("}//CLASS Starter");

        //save the file to be compiled.
        writeFile(writePath,str.toString());
            return true;
    }//generateStarter()
    private String getClassName(String fileName){
        return fileName.split(".")[0];
    }
    private String generateVariableName(){
        //return a random variable name ex, hja123;
            //or you can pass class name and return className.toLowercase();
    }
    private void writeFile(String path, String data){
        //writes a text file, with data inside...
    }


//output of class generator should be something like this
/*

Class Starter{

    private Sub1 s1 = new Sub1();
    private Sub2 s2 = new Sub1();
    private Sub3 sn = new Sub1();


    s1.method1();
    s2.method2();
    //blah blah blah
}
*/
}//CLASS Generator

class Compiler{

    public boolean compile(String javaClassPath){
        getRuntime.exec(new String[]{"c:\\java\\bin\\javac.exe",javaClassPath});
        return true;
    }
}//CLASS  Compiler

class MainStarter{
    public static void main(String args[]){
        //c:\\projx\\com\\libs\\ is the path of the 100 or 200 classes (target classes) you want to run.
        //c:\\projx\\Starter.java is the path for the class that will run the 100 class (target classes) [auto generated]
        Generator generator = new Generator("c:\\projx\\com\\libs\\","c:\\projx\\Starter.java");
        if(generator.generateStarter()){
        Compiler compiler = new Compiler();
            if(compiler.compile("c:\\projx\\Starter.java")){
                //the class is no exist and complied, so you can instantiate it and call method go()
                Starter starter = new Starter();
                starter.go();
            }else{//compiled OK
                System.out.println("compile failed!");
            }
        }else{//generated OK
            System.out.println("generate failed!");
        }
    }//main()
}//MainStarter()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23614086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档