2011-04-26 25 views
3

我有一個Java類(更準確地說是一個jpa實體),我想在PHP中「解析」。我想獲得該類的字段,與每個字段關聯的註釋等。用於Java類/代碼的PHP解析器?

是否有任何PHP工具可以讀取java源代碼並「解析」它?我想避免用我自己的自定義正則表達式重新創建輪...

+0

谷歌的第一個結果:http://freshmeat.net/projects/java2php/ – hsz 2011-04-26 18:27:48

+0

除了破壞下載鏈接似乎是一個工具來轉換Java源代碼到PHP,這是不是我想要的。我只想讀取.java文件,解析它,然後訪問它的結構,如getAllMethods getAllFields等(與DOM解析器類似) – AlfaTeK 2011-04-26 18:32:13

+0

您似乎對使用java庫的建議解決方案感到不滿。請問爲什麼?或者更多的interresting,能夠解析JPA實體的目的是什麼?根據實際需要,首選解決方案可能會改變。 – 2011-05-09 11:19:03

回答

6

我會建議編寫一個小的Java應用程序,它編譯/加載目標Java文件,最後返回/打印例如通過調用Java內省API生成的JSON數據。

這可能可能會幫助或提供有用的類:Introspection Tool for the Java(TM) Platform 1.0

雖然它並不提供了一個類的簽名容易可讀表示,Java's XMLEncoder提供了一個JavaBean的像這樣的XML表示:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.0" class="java.beans.XMLDecoder"> 
<object class="javax.swing.JFrame"> 
    <void property="name"> 
    <string>frame1</string> 
    </void> 
    <void property="bounds"> 
    <object class="java.awt.Rectangle"> 
     <int>0</int> 
     <int>0</int> 
     <int>200</int> 
     <int>200</int> 
    </object> 
    </void> 
    <void property="contentPane"> 
    <void method="add"> 
     <object class="javax.swing.JButton"> 
     <void property="label"> 
      <string>Hello</string> 
     </void> 
     </object> 
    </void> 
    </void> 
    <void property="visible"> 
    <boolean>true</boolean> 
    </void> 
</object> 
</java> 

此外,我建議看看這個page,這解釋了Java's refelection API

截至本文檔,一個非常簡單的Java程序:

import java.lang.reflect.*; 

    public class DumpMethods { 
     public static void main(String args[]) 
     { 
     try { 
      // @see Hint from Nicolas Bousquet below 
      Class c = Class.forName(args[0], false, this.getClass().getClassLoader()); 
      Method m[] = c.getDeclaredMethods(); 
      for (int i = 0; i < m.length; i++) 
      System.out.println(m[i].toString()); 
     } 
     catch (Throwable e) { 
      System.err.println(e); 
     } 
     } 
    } 

適用於Java的Stack類這樣

java DumpMethods java.util.Stack 

產生這樣的文本輸出:

public java.lang.Object java.util.Stack.push(
    java.lang.Object) 
    public synchronized 
    java.lang.Object java.util.Stack.pop() 
    public synchronized 
     java.lang.Object java.util.Stack.peek() 
    public boolean java.util.Stack.empty() 
    public synchronized 
    int java.util.Stack.search(java.lang.Object 

任何分析Java源代碼或(更復雜的)Java字節碼的努力都比使用Java來檢查Java要複雜幾倍。

此外,如果Java源代碼或類文件的語法稍後以某種方式更改,PHP解決方案甚至可能會失敗。因此,從架構的角度來看,使用PHP來實現所需的功能,與風格差距並不遙遠。

因此,我想知道,有人曾試圖 - 因爲Java的選擇是直截了當,乾淨的。

+1

這是一個黑客,我想避免如果我能爲我的目的獲得一個PHP工具。也許我沒有使用正確的措辭,我想要的不是解析器,而是其他的東西。 – AlfaTeK 2011-04-27 14:04:41

+1

嗯,在我看來,這不是破解,而是解決問題的標準方法。我明白,你想獲得所有可訪問類的簽名。你不是嗎?我覺得,爲JAVA類文件編寫解析器是一個更大的努力。但我可能是錯的,因爲你不需要解析所有的JAVA,但只能解析頂級方法。 Hm ... – SteAp 2011-04-27 18:25:56

+3

@AlfaTeK在PHP中解析Java比提議的解決方案更「瘋狂」; Java已經理解Java,PHP需要被教授。如果你需要Java的幫助來做到這一點,我相信SO上的某個人會有所幫助。 – 2011-05-07 18:29:03

-1
+0

這似乎是連接php和java服務器的方式,這不是我想要的。我想要一個可以讀取.java源代碼並「解析」它的php工具,可以使用getallmethods,getallfields等很好的方法,就像一個dom遍歷庫。 – AlfaTeK 2011-04-27 14:05:45

1

最巧妙的解決方法是調用javadoc with a custom doclet,因爲這並不需要你想文檔中的Java源的任何編譯。要將它與PHP集成,只需通過exec()調用javadoc即可。

如果您希望我爲您制定實施方案,請提供更多詳細信息,說明您希望如何通過edit訪問PHP中的信息(例如解析文本說明,數組等)。

0

ANTLR(http://www.antlr.org/)可能很適合。您可以將它與Java語法規範(http://www.antlr.org/grammar/list)一起使用,以獲取Java代碼文件的語法樹。環顧Java語法,我看到了諸如methodDeclaration,fieldDeclaration和classDeclaration之類的東西 - 聽起來就像你正在尋找的東西。 快速谷歌搜索爲ANTLR啓動了一個PHP運行時,儘管該網站聲稱是新的,可能「破損」傾向。

+0

有趣。不知道,ANTLR輸出可能由非Java /外部運行時執行。 – SteAp 2011-05-10 22:18:48