如何从文件中读取方法

时间:2014-09-23 11:56:54

标签: java reflection

在Java中,我希望能够从文件加载方法。这样,用户就可以自定义方法。用户可以创建一个txt文件,在其中键入一个普通的Java方法,然后将其加载到程序中。我知道反射,但我不知道如何阅读这样的方法。该程序将执行它就像它是一个内置的方法。无论如何要执行此操作?

我想这样做,以便用户可以自定义计算结果,从而创建用于在屏幕上显示内容的值。这是我现有的方法:

void setScale() {
        int windowDiagonal = (int) Math.sqrt(comp.getWidth() * comp.getWidth() + comp.getHeight() * comp.getHeight());
        double scale = windowDiagonal / 2500.0;
        placeWidth = (int) (comp.getWidth()/2.5);//(int) (800 * scale);
        arrowLineSize = (int) (20*scale);
        lineSize = (int) (10*scale);
        arrowSize = (int) (40*scale);
        arrowHeight = (int) (100 * scale);
        arrowNameGap = (int) (10 * scale);
        roundRaceGap = (int) (50 * scale);
        roundRaceLineGap = (int) (30 * scale);
        leftLightGap = (int) (20 * scale);
        lightSize = (int) (200 * scale);
        lightTextGap = (int) (20 * scale);
        lightToGapRatio = 5;// (int) (5 * scale);// TODO Maybe???
        lineWinnerGap = (int) (10 * scale);
        nameTimeGap = (int) (10 * scale);
        //Bottom
        lineNextUpGap = (int) (10 * scale);
        nextUpNextUpTitleGap = (int) (10 * scale);
        nextUpTitleNextUpGap = (int) (10 * scale);
        nextUpAfterNextUpGap = (int) (10 * scale);
        afterNextUpBottomGap = (int) (100 * scale);
        titleRoundRaceGap = (int) (20 * scale);
        topTitleGap = (int) (20 * scale);
        winnerArrowGap = (int) (40 * scale);
        comp.setFont(new Font("Arial", Font.BOLD, (int) (60 * scale))); //$NON-NLS-1$
    }

问题是,如果用户想要制作placeWidth,比如屏幕的一半,该怎么办?如果他们希望它是高度的一半除以宽度怎么办?由于这将是该计划的一项高级功能,因此我不想为所有可能做的事情制作文本字段和单选按钮。相反,人们可以更改计算值的代码,以便他们有更多的自由。

2 个答案:

答案 0 :(得分:2)

您可以查看Java Runtime Compiler您将读取该文件并将其包含在一个类和您要调用的方法的接口的代码中。一旦使用库编译它,就可以像任何其他类一样使用反射来运行它。

e.g。

public class GeneratedClass$12345 implements MyInterfaceForMethod {
 /* paste the contents of the method from file here */
}

编译之后,您将拥有一个实现MyInterfaceForMethod的类,您可以从中创建实例并通过接口调用该方法(您甚至可以避免使用反射)

这是example from a unit test

    CachedCompiler cc = CompilerUtils.CACHED_COMPILER;

    String text = "generated test " + new Date();
    Class compiled = cc.loadFromJava(EG_FOO_BAR_TEE, "package eg;\n" +
            '\n' +
            "import eg.components.BarImpl;\n" +
            "import eg.components.TeeImpl;\n" +
            "import eg.components.Foo;\n" +
            '\n' +
            "public class FooBarTee{\n" +
            // more source code deleted.

答案 1 :(得分:0)

你说:

  

问题是,如果用户想要制作placeWidth,比如屏幕的一半,该怎么办?如果他们希望它是高度的一半除以宽度怎么办?由于这将是该计划的一项高级功能,因此我不想为所有可能做的事情制作文本字段和单选按钮。相反,人们可以更改计算值的代码,以便他们有更多的自由。

我再次怀疑你的是XY Problem,如果你把数据与代码混淆了。为什么要通过让程序能够通过某种初始化文本文件读取这些信息来更轻松地解决这个问题,为什么要经历所有复杂的尝试读取代码?我自己如果要这样做,我会使用XML并通过JAXB将XML数据转换为Java对象,但它可以很容易地用.ini文件或类似的东西完成。与试图创建一个在文本中编译和网格编码的程序相比,这更容易实现