我有一个Java类(更确切地说是一个jpa实体),我想在PHP中“解析”。我想获得该类的字段,与每个字段相关的注释等。
是否有任何PHP工具可以读取java源代码并“解析”它?我想避免使用我自己的自定义正则表达式重新发明轮子......
答案 0 :(得分: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 :(得分:1)
最好的解决方案是调用javadoc with a custom doclet,因为这不需要编译您想要记录的java源代码。要将它与PHP集成,只需通过exec()调用javadoc。
如果您希望我为您整理一个实现,请通过edit提供有关如何通过PHP访问信息(例如解析文本描述,数组等)的更多详细信息。交。
答案 2 :(得分:0)
ANTLR(http://www.antlr.org/)可能非常适合。您可以将它与Java语法规范(http://www.antlr.org/grammar/list)一起使用,以获取Java代码文件的语法树。在Java语法中,我看到像methodDeclaration,fieldDeclaration和classDeclaration这样的东西 - 听起来就像你在寻找的东西。 一个快速的谷歌搜索开启了ANTLR的PHP运行时,虽然该网站声称是新的,可能“破损”倾向。
答案 3 :(得分:-1)
我正在使用PHP / Java Bridge