2015-11-10 29 views
2

我想解析java源代码文件中的所有方法调用,并将它们与它们各自的类相关联。首先,我认为我只需要寻找通过导入语句导入的类(我们公司的准则禁止* - 导入)。然后我可以找出使用这种类型的变量并记录它们的方法调用。解析方法调用:对其他类的隐式依赖关系

然后我注意到,有像

A.getB().getC() 

结构中的B类实际上从未进口的(因为它没有明确使用),但它的功能GETC()被调用(和源代码以某种方式暗示“取决于”它)。

还有其他这种情况吗?

回答

1

是的,您可以使用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); 
2

显然,来自同一包的类不会出现在导入语句中。 (您可能已经意识到这一点,但以防万一)。

另外,使用反射,可能有许多方法可以使用未导入的类(请参阅黑杰克发布的答案)。

此外,还可以充分直接

package.subpackage.Class 

他们也不进口资格在一份声明中类。

1

不是您正在寻找的确切答案,但您可能更适合通过现有的库构建类的抽象语法树(或类似),而不是尝试自己解析源代码。

然后,你将能够看到你有什么。

下面是一个例子:

http://spoon.gforge.inria.fr/

有好几张别人; ANTLR是,Eclipse ...

+0

谢谢。但是,这对我在源代码文件中查找所有方法调用的任务有何帮助? (我对其他信息不感兴趣,只是调用哪些类的方法)。 –

+0

勺子(作为例子)将建立你的参考:http://spoon.gforge.inria.fr/references.html – Kong

1

您可能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已经使用导入的类,如:

  • //方法B.getC :()LC; - >使用B类
  • //方法C.getD :()LD; - >使用C类

,但我认为最好的方法是用Abstract Syntax Tree作为@Kong,