2014-09-23 59 views
-1

在Java中,我希望能够从文件加载方法。用这种方法用户可以自定义方法。用户可以创建一个txt文件,在其中输入普通的Java方法,然后将其加载到程序中。我知道Reflection,但我不知道有什么方法来阅读这样的方法。该程序将执行它就像它是一个内置的方法。有没有反正这样做?如何从文件中读取方法

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

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,说一半的屏幕,该怎么办。如果他们希望它的高度除以宽度的一半,会怎么样?由于这是该程序的一项高级功能,因此我不想绕过制作文本字段和单选按钮来执行所有可能的操作。相反,人们可以更改计算值的代码,以便他们有更多的自由。

+0

这不容易做,我不知道你的问题是否可能[XY问题](http://mywiki.wooledge.org/XyProblem)。这个请求的目的是什么?也许有更好的方法来解决你的整体问题。 – 2014-09-23 11:59:12

+1

看看Java反射!我添加了更多信息的答案。 – mrquad 2014-09-23 11:59:22

回答

2

你可以看看Java Runtime Compiler你可以阅读文件,并用代码包装一个类和你想调用的方法的接口。一旦你编译了库,你可以像使用其他类一样使用反射来运行它。

例如

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. 
0

幽州:

问题是,如果用户想要制作placeWidth,说明屏幕的一半,该怎么办?如果他们希望它的高度除以宽度的一半,会怎么样?由于这是该程序的一项高级功能,因此我不想绕过制作文本字段和单选按钮来执行所有可能的操作。相反,人们可以更改计算值的代码,以便他们有更多的自由。

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