java - 比较 ASM MethodNode 参数

标签 java reflection java-bytecode-asm

我正在尝试创建一个方法来比较 2 个方法的参数并给我一个匹配参数的百分比,例如:

Method1(int i, boolean b, char c)    
Method2(boolean b, int i)   
Method3(char c)    
Method4(double d)


Method1 and Method2 = 66% -> 2 matching parameters    
Method1 and Method3 = 33% -> 1 matching parameter
Method1 and Method4 = 0%  -> 0 matching parameters

谁能告诉我如何做到这一点?

最佳答案

更新了 Holger 的提示

private static float compare(MethodNode mn1, MethodNode mn2) {
    Type[] typeArgs1 = Type.getArgumentTypes(mn1.desc);
    Type[] typeArgs2 = Type.getArgumentTypes(mn2.desc);
    int max = Math.max(typeArgs1.length, typeArgs2.length);
    if (max == 0)
        return 1f;
    int matches = 0;
    List<Type> types = Arrays.asList(typeArgs1);
    for (Type arg : typeArgs2)
        if (types.contains(arg))
            matches++;
    return ((float) matches / max);
}

原始代码:

private static float compare(MethodNode mn1, MethodNode mn2) {
    Type t1 = Type.getMethodType(mn1.desc);
    Type t2 = Type.getMethodType(mn2.desc);
    Type[] targs1 = t1.getArgumentTypes();
    Type[] targs2 = t2.getArgumentTypes();
    int max = Math.max(targs1.length, targs2.length);
    int matches = 0;
    if (max == 0) 
        return 1f;
    List<String> types1 = new ArrayList<String>();
    for (Type t : targs1) 
        types1.add(t.getDescriptor());
    for (Type t : targs2) 
        if (types1.contains(t.getDescriptor())) 
            matches++;  
    return (1F * matches / max);
}

示例方法的输出:

0,1  0.0
0,2  0.0
0,3  0.0
0,4  0.0
1,2  0.6666667
1,3  0.33333334
1,4  0.0
2,3  0.0
2,4  0.0
3,4  0.0

关于java - 比较 ASM MethodNode 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41650347/

相关文章:

bytecode - 如何覆盖类文件 (asm.ClassWriter.getCommonSuperClass)?

java - 如何解决与 java 安装相关的问题

java - 哪个是更合法的递归辅助方法?

java - 如何从不同的类中增加一个值(在主类中)

c# - 无法将 GetTypes() 转换为接口(interface)

Java:列出方法中使用的字段

java - ASM - 分支目标处的堆栈图帧不一致

Java线程池和运行时创建

c# - 我可以对 RealProxy 实例使用反射吗?

java - 如何获取在java类中声明的字段的原始类