【问题标题】:How to search for overloaded methods in a class如何在类中搜索重载方法
【发布时间】:2015-06-09 07:53:47
【问题描述】:

有没有一种简单的方法可以在java项目中搜索,类中的哪些方法具有相同的“名称”?

例如:

public class Banana{

void findBananas(Ananas ananas) { --- }

void findBananas(Bananas banana) { --- }

void findCiao(Ciao ciao) { --- }

void findCiao2(Ciao ciao) { --- }

}

搜索必须指定在 Banana 类中有重复的方法名称“findBananas”。

感谢任何工具/ide。

【问题讨论】:

  • 如何在同一个类中搜索同名方法。这些方法称为重载方法。您正在寻找的是一种查找overloaded 方法的方法。您解释它的方式有点矫枉过正。话虽如此,您是要进行文本搜索还是要在运行时通过反射找到它们?
  • 啊哈哈真的 :) 谢谢!
  • 我想列出 Java 项目中所有类中的“重复”方法。这偏离了您的初始要求。您想在所有类中查找重复项还是在每个类中查找所有类中的重复项。另外,你有没有尝试过什么?如果否,这个问题可能是编码请求的候选者,并且可能会被关闭。
  • 好的,我删除了我的答案,但你绝对可以通过反思来做到这一切。找到程序中的每个类,循环查找重复的方法。

标签: java eclipse search ide signature


【解决方案1】:

更新帖子。旧版本已删除

您可以使用反射。我不知道你的确切需求,但这个对我的项目很有效,这里是git test project

为此,您需要使用 'org.reflections:reflections:0.9.10' 库。可以从这里下载https://code.google.com/p/reflections/

public static class MethodInfo {
    Class fromClass;
    ArrayList<Method> methods = new ArrayList<Method>();

    public MethodInfo(Class fromClass) {
        this.fromClass = fromClass;
    }
}

public static HashMap<String, MethodInfo>
        findOverloadedMethods(String packageToScan, boolean declaredInClass){

    Set<Class<?>> allClasses = findAllClassesInPackage(packageToScan);
    System.out.println("Number of Classes in "+ packageToScan 
                       +" = " + allClasses.size());

    HashMap<String, MethodInfo> map = new HashMap<String, MethodInfo>();

    for (Class c : allClasses) {
        try {
            findAllMethodsForClass(c, declaredInClass, map);
        }catch (java.lang.NoClassDefFoundError e){
            //have no idea why some classes throw this NoClassDefFoundError
            System.err.println(c.getName() + ": java.lang.NoClassDefFoundError");
        }
    }

    return map;
}
public static void findAllMethodsForClass(Class c, boolean declaredInClass, 
                                          HashMap<String, MethodInfo> map)
        throws java.lang.NoClassDefFoundError{
    //Set<Method> methods = ReflectionUtils.getAllMethods(c);
    Method[] methods = declaredInClass ? c.getDeclaredMethods(): c.getMethods();

    for (Method method : methods) {
        String key = c.getName() + "." + method.getName();

        if (!map.containsKey(key)) {
            map.put(key, new MethodInfo(c));
        }

        MethodInfo methodInfo = map.get(key);
        methodInfo.methods.add(method);
    }
}
public static Set<Class<?>> findAllClassesInPackage(String packageToScan){
    Reflections reflections = new Reflections(
            new SubTypesScanner(false), new ResourcesScanner(),
            new FilterBuilder().include(FilterBuilder.prefix(packageToScan)));

    return reflections.getSubTypesOf(Object.class);
}

public static void print(HashMap<String, RScanner.MethodInfo> map){
    for (String key : map.keySet()) {
        RScanner.MethodInfo info = map.get(key);
        if (info.methods.size() > 1) {
            // wait method has 3 overloads in Object class
            if (!info.methods.get(0).getName().equals("wait"))
                System.out.println(key + " : " + info.methods.size());
        }
    }
}

【讨论】:

  • 嗯,这个程序只是打印方法名,并没有找到重载的方法。如果你想让你的程序做所有的谈话,至少你能做的就是让它做 OP 想要的:)
  • 是的,但是你可以在上面建立一个逻辑
  • 是的。但它没有回答这个问题。这更像是一种暗示。
  • 上瘾,我想列出Java项目中所有类中的“重复”方法(有数百个,所以我不能像你那样列出它们=
  • @Gaetano 如果您仍在寻找某种解决方案,请查看更新后的帖子。
猜你喜欢
  • 2018-01-08
  • 2011-07-28
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多