junit源代码中通过getMethod()获得test方法后,为什么仍然要多此一举检查是否为public???

bigbro001 2013-02-20 09:55:11
junit中关于反射调用test方法的一段源代码如下所示:

protected void runTest() throws Throwable {
assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);
Method runMethod = null;
try {
// use getMethod to get all public inherited
// methods. getDeclaredMethods returns all
// methods of this class but excludes the
// inherited ones.
runMethod = getClass().getMethod(fName, (Class[]) null);
} catch (NoSuchMethodException e) {
fail("Method \"" + fName + "\" not found");
}
if (!Modifier.isPublic(runMethod.getModifiers())) {
fail("Method \"" + fName + "\" should be public");
}

try {
runMethod.invoke(this);
} catch (InvocationTargetException e) {
e.fillInStackTrace();
throw e.getTargetException();
} catch (IllegalAccessException e) {
e.fillInStackTrace();
throw e;
}
}


runMethod = getClass().getMethod(fName, (Class[]) null);
此句返回的方法必定为public,为什么紧接着,又来了一句:
if (!Modifier.isPublic(runMethod.getModifiers()))
既然getMethod只能返回public方法,为什么还要多此一举,去检查此方法是否为public呢?
...全文
367 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbro001 2014-03-22
  • 打赏
  • 举报
回复
难道真的是防御型编程风格??
郑涛 2013-10-11
  • 打赏
  • 举报
回复
能不能注明:类#方法名
bigbro001 2013-10-11
  • 打赏
  • 举报
回复
求高人指点一二。。。到底为何junit大师要多此一举?
bigbro001 2013-03-22
  • 打赏
  • 举报
回复
多谢各位前辈提供的思路,不过还是宁愿相信大师此举一定有其理由。。。哪位高人可以指点一二?
bigbro001 2013-02-27
  • 打赏
  • 举报
回复
楼上大侠说的在理,不过LZ还是宁愿相信junit的大师不会犯错,那么做一定是有他的理由的
bigbro001 2013-02-25
  • 打赏
  • 举报
回复
请各位前辈指教。。。
shine333 2013-02-25
  • 打赏
  • 举报
回复
引用 11 楼 forgetsam 的回复:
JDK要是改了呢?再重新检查一编所有代码有没有漏洞,或者JDK更新一次我也更新一次?
这个和JDK版本没关系。这个方法(getMethod)从一开始,就被设计为(同时也是实现为)只返回public的,其他可能有变数,具体见API文档。但是public这点是没问题的。
forgetsam 2013-02-25
  • 打赏
  • 举报
回复
JDK要是改了呢?再重新检查一编所有代码有没有漏洞,或者JDK更新一次我也更新一次?
shine333 2013-02-25
  • 打赏
  • 举报
回复
补充一下,修改是since JDK7b03, 1.5,1.6代码永远不会修改
shine333 2013-02-25
  • 打赏
  • 举报
回复
good question, 但是大师不一定出来的都是大师级的。 比如JDK,里面的String代码,就出现过一个性能方面的问题,至今(应该)还留在1.6的代码里面:

    public boolean contentEquals(CharSequence cs) {
        if (count != cs.length())
            return false;
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            char v1[] = value;
            char v2[] = ((AbstractStringBuilder)cs).getValue();
            int i = offset;
            int j = 0;
            int n = count;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
        }
        // Argument is a String
        if (cs.equals(this))
            return true;
        // Argument is a generic CharSequence
        char v1[] = value;
        int i = offset;
        int j = 0;
        int n = count;
        while (n-- != 0) {
            if (v1[i++] != cs.charAt(j++))
                return false;
        }
        return true;
    }
1.7已经修复,差异就在对于AbstractStringBuilder子类,在判断过长度相同,且遍历过所有字符后,就可以断定内容相同了,可以直接return true,没必要再历经一次charAt的遍历到最后一行才return 出来。

    public boolean contentEquals(CharSequence cs) {
        if (count != cs.length())
            return false;
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            char v1[] = value;
            char v2[] = ((AbstractStringBuilder)cs).getValue();
            int i = offset;
            int j = 0;
            int n = count;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true; // <------- CHANGE SINCE 1.7
        }
        // Argument is a String
        if (cs.equals(this))
            return true;
        // Argument is a generic CharSequence
        char v1[] = value;
        int i = offset;
        int j = 0;
        int n = count;
        while (n-- != 0) {
            if (v1[i++] != cs.charAt(j++))
                return false;
        }
        return true;
    }
beiouwolf 2013-02-25
  • 打赏
  • 举报
回复
引用 6 楼 bigbro001 的回复:
junit作者是世界级大师,这么做一定有足够的理由,可是到底是什么呢?哪位前辈可否指点一二?
世界级大师也会有不知道的东西... 谁规定大师就一定是百科全书啦~~~ =P=
GuuJiang 2013-02-20
  • 打赏
  • 举报
回复
引用 1 楼 GuuJiang 的回复:
谁告诉你getMethod只能返回public的?
查了下文档确实是只能返回public的,我二了 这样看的话junit确实有点多此一举
rockets311 2013-02-20
  • 打赏
  • 举报
回复
感觉是有点扯淡啊啊啊啊
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
引用 1 楼 GuuJiang 的回复:
谁告诉你getMethod只能返回public的?
查过Class.getMethod源码只能获取public 方法
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
防御型编程风格
GuuJiang 2013-02-20
  • 打赏
  • 举报
回复
谁告诉你getMethod只能返回public的?
bigbro001 2013-02-20
  • 打赏
  • 举报
回复
junit作者是世界级大师,这么做一定有足够的理由,可是到底是什么呢?哪位前辈可否指点一二?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧