2012-08-12 38 views
3


我有一個獲取html文件內容的應用程序。正在編譯字符串作爲可能的代碼?

可以說,網頁的文字是:

String[] arr = new String[] {"!","@","#"}; 
for (String str : arr) { 
write(str); 
} 

我可以採用某種編譯這個文本和我的應用程序中運行的代碼?

感謝

+5

是的,這是可能的。 – SJuan76 2012-08-12 20:07:55

+0

棘手的部分是將其解析爲適當的Java代碼。 – Keppil 2012-08-12 20:08:41

+0

這看起來像是C#和Java之間的交叉 – Reimeus 2012-08-12 20:09:23

回答

3

使用Janino。這是一個java運行時內存中編譯器。比BCEL和其他方式更容易。

從主頁:

「什麼是JANINO

JANINO是一種超小型,超高速的Java™編譯它不僅可以編譯源文件集的一組。像JAVAC工具這樣的類文件,但也可以在內存中編譯Java™表達式,塊,類體或源文件,加載字節碼並直接在相同的JVM中執行它。工具,但是用於運行時編譯目的的嵌入式編譯器...

+0

它看起來像最好和簡單的解決方案...我會嘗試並更新 – 2012-08-12 20:37:44

+0

這是一個恥辱的泛型不支持.. – 2012-08-12 20:44:23

1

可以使用javac編譯器,或Java編譯器API或BeanShell的庫(或類似)。您可以通過多種方式進行編譯,而且非常簡單,通常可以找到解決問題的另一種方法。

代替生成源,並直接編譯其共同產生字節代碼使用ASM,Javaassist,BCEL或類似物


這似乎是相同

for(char ch: "[email protected]#".toCharArray()) 
    write(ch); 

這很可能的與

write("[email protected]#"); 
+0

正如我所說,它只是一個發明的代碼沒有任何意義......我想知道的是如何編譯文本不在應用程序代碼 – 2012-08-12 20:17:00

+0

好的,添加到我的答案。 – 2012-08-12 20:22:55

0

這通常不是很難做到,但我不得不問你能否詳細說明你想要達到的目標。我一直都在做這種類型的東西。這只是從用戶獲取信息並在代碼中的其他地方使用它的另一個示例。由於您使用java可能會查看字符串API http://docs.oracle.com/javase/6/docs/api/java/lang/String.html和字符串標記器http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/package-summary.html

現在,您可以一次將字符串分解爲單個值一個字或其他值。從那裏你可以使用float或double類中的函數isNAN()來確定它是一個數字還是字符串,或者是你測試的任何東西。現在你知道你在處理什麼,你可以用可用的形式重建數據。

值的注意如果你想使用它們作爲值使用Float(string value)構造函數。即Float x = new Float(myString)

1

由於這個問題被標記android

發佈至今只適用於「標準」的JVM,而不是Android的Dalvik虛擬機的答案。原則上,也可以在Android上使用。我不知道是否有可以嵌入的現有Java編譯器,但是您可能使用dexmaker生成最終的Dalvik字節碼。將現有的Java編譯器與dexmaker結合起來也許是可能的。

但是在嘗試這樣的事情之前請三思,並且要非常小心。 你想要的最後一件事是攻擊者在你的用戶硬件上執行任意代碼的一種方法。