隨筆-193  評(píng)論-715  文章-1  trackbacks-0
          今天調(diào)試別人寫的程序的時(shí)候,發(fā)現(xiàn)總出NoSuchMethodException,經(jīng)過(guò)一翻跟蹤,原來(lái)是getDeclaredMethod() 中報(bào)出來(lái)的,遂進(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的文檔里也沒(méi)有寫說(shuō)不行呀?
          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) 拒絕訪問(wèn)已聲明方法 
          調(diào)用方的類加載器不同于也不是該類的類加載器的一個(gè)祖先,并且對(duì) s.checkPackageAccess() 的調(diào)用拒絕訪問(wèn)該類的包 
          從以下版本開始: 
          JDK1.
          1 

          這是為什么了?用javap來(lái)看看字節(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

          }

          原來(lái)如此,在TestB的字節(jié)碼中,我們無(wú)法找到TestA中定義的tt()方法。我想這就是為什么了。
          posted on 2010-08-12 14:48 Robin's Programming World 閱讀(2515) 評(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è)問(wèn)題:我只想要指定的那一個(gè),或許可以通過(guò)方法名來(lái)循環(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ù)來(lái)解決這個(gè)問(wèn)題,現(xiàn)在算是知道什么原因了  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 泰安市| 金川县| 湖口县| 望城县| 沂南县| 玛沁县| 故城县| 南川市| 建平县| 尉氏县| 通山县| 当阳市| 谢通门县| 怀柔区| 镇康县| 泸州市| 普格县| 荥阳市| 池州市| 沙田区| 台东县| 田东县| 崇义县| 华池县| 望江县| 文山县| 邵阳县| 敦煌市| 平阳县| 泾川县| 阿拉善右旗| 甘南县| 石阡县| 延边| 巴彦淖尔市| 大渡口区| 杭锦旗| 无为县| 江西省| 寿光市| 广饶县|