2014-09-23 55 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文件或類似的東西可以輕鬆完成。這將比更容易實現比嘗試創建一個編譯和網格在文本到代碼的程序。