我想解析java源代码文件中的所有方法调用,并将它们与它们各自的类相关联。首先,我认为我只需要寻找通过导入语句导入的类(我们公司的准则禁止* - 导入)。然后我可以找出使用这种类型的变量并记录它们的方法调用。解析方法调用:对其他类的隐式依赖关系
然后我注意到,有像
A.getB().getC()
结构中的B类实际上从未进口的(因为它没有明确使用),但它的功能GETC()被调用(和源代码以某种方式暗示“取决于”它)。
还有其他这种情况吗?
我想解析java源代码文件中的所有方法调用,并将它们与它们各自的类相关联。首先,我认为我只需要寻找通过导入语句导入的类(我们公司的准则禁止* - 导入)。然后我可以找出使用这种类型的变量并记录它们的方法调用。解析方法调用:对其他类的隐式依赖关系
然后我注意到,有像
A.getB().getC()
结构中的B类实际上从未进口的(因为它没有明确使用),但它的功能GETC()被调用(和源代码以某种方式暗示“取决于”它)。
还有其他这种情况吗?
是的,您可以使用Class.forName(xxx)
在运行时加载B类。像这样:
//get Class object of B
Class classB = Class.forName("package.to.B");
//get Method object of C in class
Method methodC = classB.getMethod("C", parameterTypes of methodC);
//for static method:
methodC.invoke(null, args of methodC);
//create an instance of class B:
Object instanceOfB = classB.newInstance();
// invoke the method C on this instance
methodC.invoke(instanceOfB, args of methodC);
显然,来自同一包的类不会出现在导入语句中。 (您可能已经意识到这一点,但以防万一)。
另外,使用反射,可能有许多方法可以使用未导入的类(请参阅黑杰克发布的答案)。
此外,还可以充分直接
package.subpackage.Class
他们也不进口资格在一份声明中类。
不是您正在寻找的确切答案,但您可能更适合通过现有的库构建类的抽象语法树(或类似),而不是尝试自己解析源代码。
然后,你将能够看到你有什么。
下面是一个例子:
有好几张别人; ANTLR是,Eclipse ...
您可能intrested在javap
我已经创建A.java,B.java,C.java,D.java fiels:
public class A {
public static void main(String[] args) {
B b = new B();
b.getC().getD();
}
}
和编译这些类。
现在我们可以使用javap的掩饰的A.class:
javap -c A
,并得到字节码:
公共类A { 公开发行A(); 代码: 0:aload_0 1:invokespecial#1 //方法java/lang/Object。“” :() 4:返回
public static void main(java.lang.String[]);
Code:
0: new #2 // class B
3: dup
4: invokespecial #3 // Method B."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4 // Method B.getC:()LC;
12: invokevirtual #5 // Method C.getD:()LD;
15: pop
16: return
}
现在,你可以得到的A.class已经使用导入的类,如:
,但我认为最好的方法是用Abstract Syntax Tree作为@Kong,
谢谢。但是,这对我在源代码文件中查找所有方法调用的任务有何帮助? (我对其他信息不感兴趣,只是调用哪些类的方法)。 –
勺子(作为例子)将建立你的参考:http://spoon.gforge.inria.fr/references.html – Kong