Adrninistrator / java-callgraph2

Programs for producing static call graphs for Java programs.
Apache License 2.0
184 stars 66 forks source link

代码中使用接口的方法调用没有解析到对应的实现类的方法调用 #6

Open skysider opened 1 year ago

skysider commented 1 year ago

源码如下:

interface User{
    public String getName();
    public void setName(String name);
    public void sayHello();
}

class Student implements User{
    private String name;
    public String getName(){
        return name;
    }

    public void setName(String cname){
        name = cname;
    }
    private void secret(){
        System.out.println("secret");
    }

    public void sayHello(){
        System.out.println("hello, " + name);
        secret();
    }
}
public class UrlArgParser {
    public static void main(String args[]){
        User a = new Student();
        a.setName("great");
        a.sayHello();
    }
}

生成的调用链如下:

C:StudentStudent
C:Student User
C:Student java.io.PrintStream
C:Student java.lang.StringBuilder
C:Student java.lang.System
M:1 Student:<init>() (O)java.lang.Object:<init>() 12 1
M:2 Student:secret() (M)java.io.PrintStream:println(java.lang.String) 22 1
M:3 Student:sayHello() (O)java.lang.StringBuilder:<init>() 26 1
M:4 Student:sayHello() (M)java.lang.StringBuilder:append(java.lang.String) 26 1
M:5 Student:sayHello() (M)java.lang.StringBuilder:append(java.lang.String) 26 1
M:6 Student:sayHello() (M)java.lang.StringBuilder:toString() 26 1
M:7 Student:sayHello() (M)java.io.PrintStream:println(java.lang.String) 26 1
M:8 Student:sayHello() (O)Student:secret() 27 1
C:UrlArgParser Student
C:UrlArgParser UrlArgParser
C:UrlArgParser User
M:9 UrlArgParser:<init>() (O)java.lang.Object:<init>() 30 1
M:10 UrlArgParser:main(java.lang.String[]) (O)Student:<init>() 35 1
M:11 UrlArgParser:main(java.lang.String[]) (I)User:setName(java.lang.String) 36 1
M:12 UrlArgParser:main(java.lang.String[]) (I)User:sayHello() 37 1

main中调用的User接口的sayHello方法未关联到Student实现类的sayHello方法

Adrninistrator commented 1 year ago

需要等下一个版本,对于上面的代码可以识别到被调用的类型是Student 现在的版本会识别到被调用类型是User,还会生成一条调用关系是User调用Student,这样会间接地关联起来