2009-11-02 68 views
1

這是一個出於對java或C++的好奇心的問題,我想問問是否可以將任何文本輸入轉換爲某些可執行語句?將文本轉換爲可執行語句

例如說我有一個文本文件中包含的信息:

「類:ABC, 帕拉姆:32」

現在用C說++或Java我想讀該文件並做類似:

new Abc(32); 

我該怎麼做?它很容易閱讀價值Abc,但如何創建一個Abc類?有沒有一個標準的方法來做到這一點?在C++和Java中?

主要好奇心來自Java中那些將對象屬性存儲在XML文件中並通過讀取該XML文件創建對象的持久性機制,他們如何做到這一點?這與我上面要求的分開嗎? 編輯:這是從標準的Java序列化不同,我已經看到這是長期持久性的解決方案,其中對象實現可以更改,而不是序列化它們存儲屬性包括執行語句在XML文件中用於在運行時創建對象。

+2

你應該看看系列化;將對象保存到文件中並將其取回是序列化的一項任務。 – stijn 2009-11-02 20:00:24

+0

序列化不是C++中的一個內在功能塊,就像java一樣,並且假設他對此有興趣,他有一個預先存在的語法。另外,序列化與調用函數不同。 – Jherico 2009-11-02 20:03:51

+0

我知道序列化那不是什麼後,我試圖看看上述是否可能,其次,如何做長期持久性機制不同於序列化的工作。我知道他們使用XML文件來存儲屬性,然後在運行時讀取它來構造一個對象。 – 2009-11-02 20:10:06

回答

4

如果您的目標是採取任何文本輸入並運行任意命令,那麼開始在JVM上查找的地方是Java 6編譯器API(http://java.sun.com/javase/6/docs/api/javax/tools/package-summary.html)或JSR 223(http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting)。

如果您的目標是從文本文件中存儲和檢索信息,請查看協議緩衝區(http://code.google.com/p/protobuf/)或Java序列化API(http://www.javaworld.com/javaworld/jw-07-2000/jw-0714-flatten.html)。

+0

謝謝他們看起來有趣我會有一個loook – 2009-11-02 20:12:42

+0

如何獲得一些複選標記愛? – 2010-03-15 18:58:39

0

對於C++來說,您可以使用預編譯器的宏功能完成許多工作。對於Java來說,使用反射來實現上述示例並不困難。你的例子很稀少。你能否給出一個用例來說明爲什麼你會對此感興趣?

如果您只是在尋找一種設置程序初始狀態的機制,那麼您想要查找的是關於Inversion of Control的信息。在Java中,Spring是那裏的大型IoC庫。我不知道可能有哪些C++等價物。我懷疑C++缺乏反射功能會使IoC變得更加困難。

編輯:我沒有真正閱讀過你最後一段。可以通過多種不同的方式實現XML之間的序列化,但在Java中,如果您只是希望能夠序列化和反序列化對象的狀態,那麼JAXB就是一個允許這樣做的庫。

+0

是的,我正在尋找序列化技術,其中類不知道,但類的名稱存儲在XML文件中。因此,它不僅僅是類的狀態,而且是類的名稱,加載它的任何應用程序可能不知道在什麼狀態下直到讀取XML文件才構建什麼類。這是好奇心來自的地方。 – 2009-11-02 20:17:34

+0

一般的答案是Java,你可以使用反射從它的名字找到一個類。像Spring這樣的庫創建了一種有條不紊的方式來將XML文件轉換爲一組創建的對象,都圍繞着這個機制。 – Jherico 2009-11-02 22:10:18

0

創建一個解析器。對於Java和C++,我建議你使用Antlr

對於分析器生成時未知的類,您可能還需要使用Reflection API。

0

根據語法解析輸入(記住yacc?)並將語義操作附加到派生規則。這是編譯器所做的一個非常遙遠的描述。

2

你首先需要解析你的迷你語言。所以(如前所述)Antlr或Javacc爲您的語言創建解析器。

之後,您需要使用'解釋器'/目標語言的元編程功能。對於Java,您想要start with reflection,如果您絕對需要它,稍後轉到字節碼生成。

+0

是的,這是我後,運行時的文本執行的事情。 – 2009-11-02 20:13:51

2

[C++ answer]

你不能這樣做。你需要在運行時解析/編譯C++代碼,這不是你想要處理的,相信我。

但是,如果您剛剛從「在Java中將對象屬性存儲在XML文件中的那些持久性機制」中提到,那麼您要尋找的關鍵字是Serialization。許多序列化技術和庫可用於C++,例如boost::serialization

1

在java中,你可以做這樣的:

// Read data from file: 
String cls = "java.math.BigDecimal"; 
String arg = "123.45"; 

// Create the object 
Class<?> objClass = Class.forName(cls); 
Object obj = objClass.getConstructor(new Class[] {String.class }).newInstance(arg); 
System.out.println("The object is: " + obj.toString() + "; type: " 
    + obj.getClass().getSimpleName()); 
+0

有人問到「任何文字」... – 2009-11-02 20:24:13

+0

這是沿着什麼我看,雖然我沒有測試過的東西。這可能是構建未知參數未知對象的解決方案。現在我需要如何執行包括方法的任何文本,如果方法可以被覆蓋,那麼這是一大步。 – 2009-11-02 20:29:58

1

Java 6的支持腳本語言,它可以做的「東西」與像你描述一個傳遞的字符串。

有一個JavaScript引擎和一個BeanShell引擎可用,但我不確定他們是否可以即時創建新類。所以,你需要做的就是找到你

https://scripting.dev.java.net/

喜歡支持的腳本語言和安裝它,使用它:)

+0

Downvoters,請評論爲什麼... – 2009-11-02 21:31:23

+0

似乎他們從未聽過「解析器」這個詞... – 2009-11-25 20:44:07

+0

我自那以後發現groovy可以在飛行中創建類。帶註釋。這對Web服務很有用。 – 2016-11-02 11:54:19