繁体   English   中英

如何从文件读取方法

[英]How to read a method from file

在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,例如屏幕的一半,该怎么办? 如果他们希望它是高度的一半除以宽度怎么办? 由于这将是该程序的高级功能,因此我不想四处为它可以做的所有不同事情制作文本字段和单选按钮。 相反,可以更改用于计算值的代码,以使它们具有更大的自由度。

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

例如

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

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

这是单元测试的一个例子

    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.

您声明:

问题是,如果用户想设置placeWidth,例如屏幕的一半,该怎么办? 如果他们希望它是高度的一半除以宽度怎么办? 由于这将是该程序的高级功能,因此我不想四处为它可以做的所有不同事情制作文本字段和单选按钮。 相反,可以更改用于计算值的代码,以使它们具有更大的自由度。

再次,我想知道您是否是XY问题,以及您是否将数据与代码混淆。 为什么通过让程序能够通过某种初始化文本文件读取此信息来更轻松地解决此问题,为什么要遍历所有尝试读取代码的复杂步骤呢? 如果我要这样做,我将使用XML并通过JAXB将XML数据转换为Java对象,但是使用.ini文件或类似文件也可以轻松完成。 与尝试创建一个将文本编译并网格化为代码的程序相比,实现起来容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM