2011-12-29 266 views
-1

我的問題與Java中不存在函數eval()的現象有關。在互聯網上閱讀了一段時間後,我發現我能做的最好的事情就是創建我自己的解析器作爲Java函數。但如何做到這一點?我實際需要的是一個函數,它讀取上述數組的第一列並且一個接一個地返回所有這些值。但請注意,這些值是字符串存儲在一個字符串數組,因此是字符串,但它們代表不同類型的對象,如X1,X2,X3,X3等。Java中eval()的實現

如果我設法讀取此String值,說X1,作爲一個對象,說X1,然後我可以用它來調用一些與object-X1相關的函數,比如x1.classifyInstance(等等等等等等);

希望這裏有人對如何解決這個問題有任何想法......!

編輯:此線程與我的第一篇文章here密切相關!

+2

你究竟想要什麼... plz更精確... – aProgrammer 2011-12-29 10:53:37

+1

聽起來你正在尋找[Reflection](http://docs.oracle.com/javase/tutorial/reflect/) – 2011-12-29 10:55:11

+0

請參閱這裏的一些選項http://stackoverflow.com/questions/1168931/how-to-create-an-object-from-a-string-in-java-how-to-eval-a-string 並可能在這裏http://stackoverflow.com/questions/8545869/implemention-of-eval-parser-and-2d-array-in-java – tryme 2011-12-29 10:55:12

回答

0

爲了能夠在Java中調用一個對象的方法,您需要一個此對象的實例,並且您需要使用適當的類型聲明一個變量。唯一的另一種方法是使用反射來調用該方法。 Java不像JavaScript:它是強類型的,沒有鴨子輸入。

什麼你應該做的是讓所有這些對象實現共同的接口:

public interface Classifyable { 
    void classify(); 
} 

,並使用下面的代碼(你需要處理的異常,但我忽略他們):

for (String s : stringArray) { 
    // s is the class name of the object to instantiate, right? 
    Class<?> clazz = Class.forName(s); 
    Classifyable c = (Classifyable) clazz.newInstance(); // calls the no-arg constructor 
    c.classify(); 
} 
2

可以使用ScriptEngine類的eval()方法來評估String作爲JavaScript字符串

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("js");   
Object result = engine.eval("4*5"); 
System.out.println("..result..."+String.valueOf(result)); 

結果= ..result...20.0

1

自己構建Java編譯器是一項巨大的工作。基本上有三種選擇:

  1. 使用ToolProvider.getSystemJavaCompiler()。在How to create an object from a string in Java (how to eval a string)?的第二個答案也使用這個,並可能給你一個想法如何使用它。
  2. 使用第三方java編譯器,如Janino,Java編譯器http://docs.codehaus.org/display/JANINO/Home
  3. 使用ScriptEngineManager使用Javascript(或其他語言)編譯器並將JavaScript數組轉換爲Java。