<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-193  評論-715  文章-1  trackbacks-0
    今天調(diào)試別人寫的程序的時候,發(fā)現(xiàn)總出NoSuchMethodException,經(jīng)過一翻跟蹤,原來是getDeclaredMethod() 中報出來的,遂進行一翻調(diào)查:

    假設(shè)我有兩個類,TestB繼承TestA,如下:
    public class TestA {
        
    public void tt() {
        }

    }

    public class TestB extends TestA {
        
    public void aaa() {
        }

    }
    另有一個帶main方法的主程序:
    import java.lang.reflect.Method;

    public class Test {

        
    public static void main(String[] args) {
            
    try {
                TestB b
    =new TestB();
                Method m 
    = b.getClass().getDeclaredMethod("tt"new Class []{});
                System.out.println(m);
            }
     catch (Exception e) {
                e.printStackTrace();
            }

        }


    }

    這個程序就會拋出如下異常:
    java.lang.NoSuchMethodException: TestB.tt()
        at java.lang.Class.getDeclaredMethod(Class.java:
    1937)
        at Test.main(Test.java:
    8)

    給我直觀的感覺就是不能反射父類中的方法,但是為什么了?JDK的文檔里也沒有寫說不行呀?
    getDeclaredMethod
    public Method getDeclaredMethod(String name,
                                    Class parameterTypes)
                             
    throws NoSuchMethodException,
                                    SecurityException返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。name 參數(shù)是一個 String,它指定所需方法的簡稱,parameterTypes 參數(shù)是 Class 對象的一個數(shù)組,它按聲明順序標識該方法的形式參數(shù)類型。如果在某個類中聲明了帶有相同參數(shù)類型的多個方法,并且其中有一個方法的返回類型比其他方法的返回類型都特殊,則返回該方法;否則將從中任選一個方法。如果名稱是 
    "<init>” 或 “<clinit>",則引發(fā)一個 NoSuchMethodException。 

    參數(shù):
    name 
    - 方法名
    parameterTypes 
    - 參數(shù)數(shù)組 
    返回:
    該類與指定名和參數(shù)相匹配的方法的 Method 對象 
    拋出: 
    NoSuchMethodException 
    - 如果找不到匹配的方法。 
    NullPointerException 
    - 如果 name 為 null 
    SecurityException 
    - 如果存在安全管理器 s,并滿足下列任一條件: 
    調(diào)用 s.checkMemberAccess(
    this, Member.DECLARED) 拒絕訪問已聲明方法 
    調(diào)用方的類加載器不同于也不是該類的類加載器的一個祖先,并且對 s.checkPackageAccess() 的調(diào)用拒絕訪問該類的包 
    從以下版本開始: 
    JDK1.
    1 

    這是為什么了?用javap來看看字節(jié)碼:執(zhí)行javap -c TestA 得到如下結(jié)果:
    Compiled from "TestA.java"
    public class TestA extends java.lang.Object{
    public TestA();
      Code:
       
    0:   aload_0
       
    1:   invokespecial   #8//Method java/lang/Object."<init>":()V
       4:   return

    public void tt();
      Code:
       
    0:   return

    }

    再執(zhí)行javap -c TestB
    Compiled from "TestB.java"
    public class TestB extends TestA{
    public TestB();
      Code:
       
    0:   aload_0
       
    1:   invokespecial   #8//Method TestA."<init>":()V
       4:   return

    public void aaa();
      Code:
       
    0:   return

    }

    原來如此,在TestB的字節(jié)碼中,我們無法找到TestA中定義的tt()方法。我想這就是為什么了。
    posted on 2010-08-12 14:48 Robin's Programming World 閱讀(2511) 評論(3)  編輯  收藏 所屬分類: Java

    評論:
    # re: Investigate getDeclaredMethod of Java Reflection 2010-08-12 16:39 | 路人
    。。。
    使用getMethod()就好了,獲取所有公開的方法,包括父類的。  回復(fù)  更多評論
      
    # re: Investigate getDeclaredMethod of Java Reflection 2010-08-12 17:00 | Robin's Java World
    @路人
    有個問題:我只想要指定的那一個,或許可以通過方法名來循環(huán),但如果這個方法是重載的了?
      回復(fù)  更多評論
      
    # re: Investigate getDeclaredMethod of Java Reflection 2010-08-13 15:35 | 狄浩
    ...當年寫底層公用方法時候是用try(){}catch(){}反復(fù)回調(diào)自身函數(shù)來解決這個問題,現(xiàn)在算是知道什么原因了  回復(fù)  更多評論
      
    主站蜘蛛池模板: 免费精品国产自产拍在线观看图片| av免费不卡国产观看| 五月天网站亚洲小说| 国产a视频精品免费观看| jizzjizz亚洲日本少妇| 亚洲Av无码专区国产乱码DVD| 亚洲性线免费观看视频成熟| 亚洲av成人中文无码专区| 黑人精品videos亚洲人| 欧美a级成人网站免费| 三级毛片在线免费观看| 亚洲一区中文字幕| 久久久无码精品亚洲日韩软件| a国产成人免费视频| 亚洲中文字幕AV每天更新| 亚洲热妇无码AV在线播放| 国产1024精品视频专区免费| www在线观看播放免费视频日本| 亚洲日本香蕉视频| 国产亚洲精品成人AA片新蒲金 | 一级一片免费视频播放| 亚洲婷婷天堂在线综合| 国产啪亚洲国产精品无码| 国产成人免费网站| 伊人久久免费视频| 一级毛片免费一级直接观看| 91亚洲国产成人久久精品| 久久久久亚洲精品无码网址| 午夜视频免费成人| 精品女同一区二区三区免费站| 国产精品无码免费专区午夜| 亚洲日韩乱码中文字幕| 亚洲综合久久久久久中文字幕| 红杏亚洲影院一区二区三区| 在线播放免费人成视频在线观看| 最近免费视频中文字幕大全| 最近中文字幕免费大全| 日本激情猛烈在线看免费观看| 亚洲日韩精品无码AV海量| 亚洲欧洲精品久久| 亚洲人成电影在在线观看网色|