检索 Java 中函数执行的代码
Retrieve code executed by function in Java
我正在尝试分析一些 Java 代码,看看代码是否写得太复杂了。我从一个包含 Java-class 内容的字符串开始。
给定一个函数名,我想从那里检索该函数的 "inner code" 。在这个例子中:
public class testClass{
public int testFunction(char x) throws Exception{
if(x=='a'){
return 1;
}else if(x=='{'){
return 2;
}else{
return 3;
}
}
public int testFunctionTwo(int y){
return y;
}
}
我想在调用 String code = getcode("testFunction");
时得到 code
包含 if(x=='a'){ ... return 3; }
。我让输入代码变得格外难看,以演示在逐字符分析时可能遇到的一些问题(因为 else if
,大括号将不再匹配,因为异常抛出,函数声明不是 functionName{ //contents } 等形式)
是否有可靠的方法来获取testFunction
的内容,还是我应该手动实现描述的所有问题?
您是否考虑过使用解析器来读取您的代码?那里有很多解析器,上次我处理这样的问题时 http://qdox.codehaus.org 很快就解决了这类问题。
您需要一个 java 解析器。我也和 QDox 一起工作过。这个用起来很简单。此处示例:
import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import java.io.File;
import java.io.IOException;
public class Parser {
public void parseFile() throws IOException {
File file = new File("/path/to/testClass.java");
JavaProjectBuilder builder = new JavaProjectBuilder();
builder.addSource(file);
for (JavaClass javaClass : builder.getClasses()) {
if (javaClass.getName().equals("testClass")) {
for (JavaMethod javaMethod : javaClass.getMethods()) {
if (javaMethod.getName().equals("testMethod")) {
System.out.println(javaMethod.getSourceCode());
}
}
}
}
}
}
我正在尝试分析一些 Java 代码,看看代码是否写得太复杂了。我从一个包含 Java-class 内容的字符串开始。 给定一个函数名,我想从那里检索该函数的 "inner code" 。在这个例子中:
public class testClass{
public int testFunction(char x) throws Exception{
if(x=='a'){
return 1;
}else if(x=='{'){
return 2;
}else{
return 3;
}
}
public int testFunctionTwo(int y){
return y;
}
}
我想在调用 String code = getcode("testFunction");
时得到 code
包含 if(x=='a'){ ... return 3; }
。我让输入代码变得格外难看,以演示在逐字符分析时可能遇到的一些问题(因为 else if
,大括号将不再匹配,因为异常抛出,函数声明不是 functionName{ //contents } 等形式)
是否有可靠的方法来获取testFunction
的内容,还是我应该手动实现描述的所有问题?
您是否考虑过使用解析器来读取您的代码?那里有很多解析器,上次我处理这样的问题时 http://qdox.codehaus.org 很快就解决了这类问题。
您需要一个 java 解析器。我也和 QDox 一起工作过。这个用起来很简单。此处示例:
import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import java.io.File;
import java.io.IOException;
public class Parser {
public void parseFile() throws IOException {
File file = new File("/path/to/testClass.java");
JavaProjectBuilder builder = new JavaProjectBuilder();
builder.addSource(file);
for (JavaClass javaClass : builder.getClasses()) {
if (javaClass.getName().equals("testClass")) {
for (JavaMethod javaMethod : javaClass.getMethods()) {
if (javaMethod.getName().equals("testMethod")) {
System.out.println(javaMethod.getSourceCode());
}
}
}
}
}
}