2014-12-08 71 views
1

我有一個文本文件,該文件列出了可在泵類上執行的所有操作。文本文件的內容從文本文件中讀取方法並在程序中執行它們

例如

Start PayCredit Reject Start PayCredit Reject TurnOff 
.... 
.... so on. 

這些泵級(開始(),拒絕()等)

我需要編寫代碼,在那裏我可以閱讀的方法這些方法從文件一個接一個地執行它們。

public static void main(String[] args) throws IOException 
{ 

    Pump gp= new Pump(); 
    File file=new File("C:\\Users\\Desktop\\checker\\check.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
    String line=null; 
    while((line=br.readLine())!=null) 
    { 
     String words[]=line.split(" "); 
     for(int i=0;i<words.length;i++) 
     { 
      String temp=words[i]+"()"; 
      gp.temp; //compilation error 
     } 
    } 

} 

你能告訴我怎樣才能實現這一功能。

+2

使用Java反射:https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html – 2014-12-08 08:20:18

回答

0

首先請注意,Java在運行時不會被解釋。所以你不能這樣做。

如果你已經有了方法,如開始PayCredit拒絕岔路等您可以通過以下方式做到這一點:

for(int i=0;i<words.length;i++) 
{ 
    String temp=words[i]; 
    if (temp.equals("Start") gp.Start(); 
    else if (temp.equals("PayCredit") gp.PayCredit(); 
    ... 
} 
0

使用開關的情況下

for(int i=0;i<words.length;i++) { 
    String temp=words[i]; 
    switch(temp) { 
     case "Start": 
      gp.start(); 
      break; 
     case "PayCredit": 
      gp.PayCredit(); 
      break; 
    } 
} 
+0

它適用於Java 7+。以前的版本不支持開啓字符串。 – 2014-12-08 09:55:10

+1

你是對的,我忘了它只是在Java 7中添加 – Assaf 2014-12-08 10:05:27

0

您可以使用反射做到這一點,例如

​​

這是假設你想調用這個方法,當然,這是一個實例方法。查看Class.getMethod和相關方法以及Method本身,瞭解更多詳細信息。您可能需要getDeclaredMethod,而您可能需要使其可訪問。

我會看看你是否可以想到一種避免這種可能的方法,儘管如此 - 反射會很快變得雜亂。值得退一步考慮這是否是最好的設計。如果您向我們提供更多詳細信息,我們可能會提出替代方案。

1

如果您對反射不太熟悉,也許嘗試使用Spring Framework項目中的org.springframework.util.ReflectionUtils

的代碼會去是這樣的:

Pump gp = new Pump(); 
.... 
String temp = // from text file 
.... 
Method m = ReflectionUtils.findMethod(Pump.class, temp); 
Object result = ReflectionUtils.invokeMethod(m, gp); 
1

您將需要使用反射在運行時要調用的方法。這是一個簡單的例子,假設所有的方法都不帶任何參數。

Class<? extends Pump> pumpClass = gp.getClass(); 
String methodName = words[i]; 
Method toInvoke = pumpClass.getMethod(methodName); 
if (null != toInvoke) { 
    toInvoke.invoke(gp); 
} 
相關問題