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

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

          }

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

          }
          另有一個(gè)帶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();
                  }

              }


          }

          這個(gè)程序就會(huì)拋出如下異常:
          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返回一個(gè) Method 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類或接口的指定已聲明方法。name 參數(shù)是一個(gè) String,它指定所需方法的簡(jiǎn)稱,parameterTypes 參數(shù)是 Class 對(duì)象的一個(gè)數(shù)組,它按聲明順序標(biāo)識(shí)該方法的形式參數(shù)類型。如果在某個(gè)類中聲明了帶有相同參數(shù)類型的多個(gè)方法,并且其中有一個(gè)方法的返回類型比其他方法的返回類型都特殊,則返回該方法;否則將從中任選一個(gè)方法。如果名稱是 
          "<init>” 或 “<clinit>",則引發(fā)一個(gè) NoSuchMethodException。 

          參數(shù):
          name 
          - 方法名
          parameterTypes 
          - 參數(shù)數(shù)組 
          返回:
          該類與指定名和參數(shù)相匹配的方法的 Method 對(duì)象 
          拋出: 
          NoSuchMethodException 
          - 如果找不到匹配的方法。 
          NullPointerException 
          - 如果 name 為 null 
          SecurityException 
          - 如果存在安全管理器 s,并滿足下列任一條件: 
          調(diào)用 s.checkMemberAccess(
          this, Member.DECLARED) 拒絕訪問已聲明方法 
          調(diào)用方的類加載器不同于也不是該類的類加載器的一個(gè)祖先,并且對(duì) 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 閱讀(2517) 評(píng)論(3)  編輯  收藏 所屬分類: Java

          評(píng)論:
          # re: Investigate getDeclaredMethod of Java Reflection 2010-08-12 16:39 | 路人
          。。。
          使用getMethod()就好了,獲取所有公開的方法,包括父類的。  回復(fù)  更多評(píng)論
            
          # re: Investigate getDeclaredMethod of Java Reflection 2010-08-12 17:00 | Robin's Java World
          @路人
          有個(gè)問題:我只想要指定的那一個(gè),或許可以通過方法名來循環(huán),但如果這個(gè)方法是重載的了?
            回復(fù)  更多評(píng)論
            
          # re: Investigate getDeclaredMethod of Java Reflection 2010-08-13 15:35 | 狄浩
          ...當(dāng)年寫底層公用方法時(shí)候是用try(){}catch(){}反復(fù)回調(diào)自身函數(shù)來解決這個(gè)問題,現(xiàn)在算是知道什么原因了  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 定陶县| 达尔| 建平县| 信丰县| 宜阳县| 富阳市| 托里县| 西乌珠穆沁旗| 萍乡市| 万载县| 叶城县| 巴林右旗| 普陀区| 濮阳县| 亳州市| 潮安县| 广昌县| 吕梁市| 城步| 平凉市| 镇康县| 木兰县| 阿图什市| 卢龙县| 开原市| 寻甸| 通许县| 伊通| 庄浪县| 广州市| 遂平县| 琼海市| 资中县| 上高县| 遵义市| 比如县| 仙游县| 涟源市| 龙门县| 攀枝花市| 普定县|