<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() 中報(bào)出來的,遂進(jìn)行一翻調(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ù)組,它按聲明順序標(biāo)識該方法的形式參數(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 | 狄浩
    ...當(dāng)年寫底層公用方法時候是用try(){}catch(){}反復(fù)回調(diào)自身函數(shù)來解決這個問題,現(xiàn)在算是知道什么原因了  回復(fù)  更多評論
      
    主站蜘蛛池模板: 久久av免费天堂小草播放| 亚洲无av在线中文字幕| 69视频在线是免费观看| 美女黄色免费网站| 亚洲伊人久久大香线蕉啊| 久久精品国产亚洲AV麻豆不卡| 四虎1515hm免费国产| 久久WWW免费人成人片| 在线免费观看国产| a级毛片免费在线观看| 国产高清对白在线观看免费91 | 亚洲精品无AMM毛片| 亚洲综合激情另类小说区| 亚洲av无码国产精品夜色午夜| 无码不卡亚洲成?人片| 国产一级大片免费看| 青青青国产免费一夜七次郎 | 亚洲资源在线视频| 亚洲av午夜福利精品一区| 国产啪亚洲国产精品无码| 国产性生交xxxxx免费| 免费无遮挡无码视频网站| 最近免费中文字幕4| 免费中文熟妇在线影片| 亚洲免费福利在线视频| 免费观看无遮挡www的视频| 91精品免费观看| 久久ww精品w免费人成| 暖暖免费在线中文日本| 精品国产一区二区三区免费| 97超高清在线观看免费视频| 99久久99这里只有免费的精品 | 亚洲午夜无码久久久久| 又黄又大又爽免费视频| 成人亚洲综合天堂| 日韩精品电影一区亚洲| 亚洲高清无码综合性爱视频| 亚洲国产成人a精品不卡在线| 免费在线视频一区| 相泽亚洲一区中文字幕| 亚洲AV日韩AV天堂一区二区三区|