程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何找到用Java调用给定方法的所有方法?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何找到用Java调用给定方法的所有方法??

开发过程中遇到如何找到用Java调用给定方法的所有方法?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何找到用Java调用给定方法的所有方法?的解决方法建议,希望对你解决如何找到用Java调用给定方法的所有方法?有所启发或帮助;

为了分析字节码,我建议使用ASM。给定要分析的类列表,可以使访问者找到您感兴趣的方法调用。下面是一个分析jar文件中类的实现。

请注意,ASM使用带有’/’而不是’。的internalnames。作为分隔符。将目标方法指定为不带修饰符的标准声明。

例如,列出在Java运行时jar中可能正在调用System.out.println(“ foo”)的方法:

java -cp "classes;asm-3.1.jar;asm-commons-3.1.jar" App \
    c:/java/jdk/jre/lib/rt.jar \
    java/io/PrintStream  "voID println(String)"

编辑:添加了源代码和行号:请注意,这仅指示每个调用方法的最后一个目标方法调用-原始q只想知道哪些方法。我将其作为练习供读者显示调用方法声明的行号或每个目标调用的行号,具体取决于您实际要执行的操作。:)

结果是:

LogSupport.java:44 com/sun/activation/regiStriEs/LogSupport log (Ljava/lang/String;)V LogSupport.java:50 com/sun/activation/regiStriEs/LogSupport log (Ljava/lang/String;Ljava/lang/Throwable;)V … Throwable.java:498 java/lang/Throwable printstacktraceAsCause (Ljava/io/PrintStream;[Ljava/lang/StackTraceElement;)V – 885 methods invoke java/io/PrintStream println (Ljava/lang/String;)V


资源:

public class App { private String targetClass; private Method targetmethod;

private AppClassvisitor cv;

private ArrayList<Callee> callees = new ArrayList<Callee>();

private static class Callee {
    String classname;
    String methodname;
    String methodDesc;
    String source;
    int line;

    public Callee(String cname, String mname, String mDesc, String src, int ln) {
        classname = cname; methodname = mname; methodDesc = mDesc; source = src; line = ln;
    }
}

private class AppMethodVisitor extends MethodAdapter {

    Boolean callsTarget;
    int line;

    public AppMethodVisitor() { super(new EmptyVisitor()); }

    public voID visitMethodInsn(int opcode, String owner, String name, String desc) {
        if (owner.equals(targetClass)
                && name.equals(targetmethod.getname())
                && desc.equals(targetmethod.getDescriptor())) {
            callsTarget = true;
        }
    }

    public voID visitCode() {
        callsTarget = false;
    }

    public voID visitlinenumber(int line, Label start) {
        this.line = line;
    }

    public voID visitEnd() {
        if (callsTarget)
            callees.add(new Callee(cv.classname, cv.methodname, cv.methodDesc, 
                    cv.source, linE));
    }
}

private class AppClassvisitor extends ClassAdapter {

    private AppMethodVisitor mv = new AppMethodVisitor();

    public String source;
    public String classname;
    public String methodname;
    public String methodDesc;

    public AppClassvisitor() { super(new EmptyVisitor()); }

    public voID visit(int version, int access, String name,
                      String signature, String supername, String[] interfaces) {
        classname = name;
    }

    public voID visitsource(String source, String deBUG) {
        this.source = source;
    }

    public MethodVisitor visitMethod(int access, String name, 
                                     String desc, String signature,
                                     String[] exceptions) {
        methodname = name;
        methodDesc = desc;

        return mv;
    }
}


public voID findCallingMethodsInJar(String jarPath, String targetClass,
                                    String targetmethodDeclaration) throws Exception {

    this.targetClass = targetClass;
    this.targetmethod = Method.getmethod(targetmethodDeclaration);

    this.cv = new AppClassvisitor();

    Jarfile jarfile = new Jarfile(jarPath);
    Enumeration<JarEntry> entrIEs = jarfile.entrIEs();

    while (entrIEs.hasMoreElements()) {
        JarEntry entry = entrIEs.nextElement();

        if (entry.getname().endsWith(".class")) {
            inputStream stream = new BufferedinputStream(jarfile.geTinputStream(entry), 1024);
            ClassReader reader = new ClassReader(stream);

            reader.accept(cv, 0);

            stream.close();
        }
    }
}


public static voID main( String[] args ) {
    try {
        App app = new App();

        app.findCallingMethodsInJar(args[0], args[1], args[2]);

        for (Callee c : app.callees) {
            System.out.println(c.source+":"+c.line+" "+c.classname+" "+c.methodname+" "+c.methoddesc);
        }

        System.out.println("--\n"+app.callees.size()+" methods invoke "+
                app.targetClass+" "+
                app.targetmethod.getname()+" "+app.targetmethod.getDescriptor());
    } catch(Exception X) {
        x.printstacktrace();
    }
}

} ```

解决方法

我需要获取所有调用者方法的列表,以获取Java感兴趣的方法。有什么工具可以帮助我吗?

编辑:我忘了提到我需要从程序中执行此操作。我使用的是Java Pathfinder,我想将其作为调用我感兴趣的方法的所有方法来运行。

大佬总结

以上是大佬教程为你收集整理的如何找到用Java调用给定方法的所有方法?全部内容,希望文章能够帮你解决如何找到用Java调用给定方法的所有方法?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。