java - 如何查找一个方法中调用的所有方法?

标签 java class methods bytecode

如何在特定方法中调用其他类的方法?

示例

方法 getItem1()

public String getItem1() throws UnsupportedEncodingException{
    String a = "2";
    a.getBytes();
    a.getBytes("we");
    System.out.println(a);
    int t = Integer.parseInt(a);
    return a;
}

getItem1()中调用的方法是:

  1. String.getBytes()
  2. String.getBytes(String)
  3. PrintStream.println(String)
  4. Integer.parseInt(String)

最佳答案

我会用javassist来做到这一点。

假设您的类路径中有以下可访问的类,并且想要查找从 getItem1() 调用的所有方法:

class MyClass {
  public String getItem1() throws UnsupportedEncodingException{
    String a = "2";
    a.getBytes();
    a.getBytes("we");
    System.out.println(a);
    int t = Integer.parseInt(a);
    return a;
  }
}

您已经编译了这个 MyClass。 创建另一个使用 javassist api 的类:

public class MethodFinder {

  public static void main(String[] args) throws Throwable {
    ClassPool cp = ClassPool.getDefault();
    CtClass ctClass = cp.get("MyClass");
    CtMethod method = ctClass.getDeclaredMethod("getItem1");
    method.instrument(
        new ExprEditor() {
            public void edit(MethodCall m)
                          throws CannotCompileException
            {
                System.out.println(m.getClassName() + "." + m.getMethodName() + " " + m.getSignature());
            }
        });
  }
}

MethodFinder 运行的输出是:

java.lang.String.getBytes ()[B   
java.lang.String.getBytes (Ljava/lang/String;)[B   
java.io.PrintStream.println (Ljava/lang/String;)V   
java.lang.Integer.parseInt (Ljava/lang/String;)I   

关于java - 如何查找一个方法中调用的所有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58283133/

相关文章:

android - 如何从 AsyncTask 查询另一个 Activity 中的游标?

java - 如何从外部类的main方法调用匿名类的方法

Java代码片段逻辑

java - 在 java-spring-tomcat 上设置 session cookie 属性 "Domain"

java - 单击selenium中的CSS按钮

c++ - 链接错误 - 功能二叉树,派生类

java - 将 JsonArray 添加到 JsonObject

python - 如何使自定义类成为 Python 中的集合

c++ - 操作符不匹配* =

java - Java中用多个子类实现父类方法