Robin's Programming World
I Love Programming As My Life!
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-193 評論-715 文章-1 trackbacks-0
Investigate getDeclaredMethod of Java Reflection
今天調(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ù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
Ubuntu環(huán)境下Apache2與Tomcat集成
Spring 3 MVC and JSON example
Android Media Player 深入觀察
[轉(zhuǎn)]編寫高效的Android代碼
Android程序完全退出的三種方法
使用ANT批量編譯Flex應(yīng)用和模塊(Use ANT to batch compiling application and modules of Flex)
Investigate getDeclaredMethod of Java Reflection
Eclipse空心J圖標(biāo)的含義
Memcached Study Notes
BlazeDS自定義認(rèn)證與權(quán)限控制
<
2010年8月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(49)
給我留言
查看公開留言
查看私人留言
隨筆分類
(215)
.Net(1)
DB(8)
Flex & Flash(11)
Java(72)
OS(25)
RUP(1)
weblogic(3)
Webshere(16)
其它(50)
心情(2)
翻譯(1)
讀書(9)
轉(zhuǎn)載(16)
隨筆檔案
(181)
2014年8月 (1)
2014年4月 (1)
2014年2月 (2)
2014年1月 (1)
2012年11月 (1)
2012年9月 (2)
2012年7月 (1)
2012年6月 (3)
2012年1月 (2)
2011年12月 (4)
2011年10月 (1)
2011年8月 (3)
2011年7月 (2)
2011年4月 (1)
2010年11月 (2)
2010年10月 (1)
2010年9月 (2)
2010年8月 (5)
2010年7月 (1)
2010年5月 (2)
2010年4月 (7)
2010年3月 (7)
2009年12月 (6)
2009年10月 (1)
2009年9月 (1)
2009年8月 (2)
2009年6月 (3)
2009年5月 (2)
2009年4月 (2)
2009年2月 (3)
2009年1月 (4)
2008年11月 (1)
2008年10月 (2)
2008年9月 (9)
2008年8月 (4)
2008年7月 (5)
2008年5月 (2)
2008年4月 (1)
2008年3月 (3)
2008年2月 (1)
2008年1月 (7)
2007年12月 (6)
2007年11月 (6)
2007年10月 (3)
2007年9月 (1)
2007年8月 (6)
2007年7月 (4)
2007年6月 (2)
2007年5月 (3)
2007年3月 (1)
2007年2月 (1)
2007年1月 (3)
2006年12月 (7)
2006年10月 (1)
2006年8月 (3)
2006年7月 (1)
2006年6月 (5)
2006年4月 (6)
2006年3月 (2)
2006年2月 (3)
2006年1月 (1)
2005年11月 (5)
相冊
文章相關(guān)圖片
收藏夾
other
Friend Links
Tiger的Blog,專注于過程改進(jìn),項(xiàng)目管理,質(zhì)量管理三個方向。
zrfunds
搜索
積分與排名
積分 - 754668
排名 - 60
最新評論
1.?re: XFire完整入門教程
樓主,請問你做過xfire使用spring的jdbc模板訪問數(shù)據(jù)庫的例子嗎,急求啊?xfire和spring的結(jié)合在不訪問數(shù)據(jù)庫時(就像你這個例子一樣)已經(jīng)跑通了,但是需要使用jdbc時老出問題。謝謝
--fqjabc
2.?re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn)
不需要構(gòu)建DOM
--bns
3.?re: Spring Security 3.x 完整入門教程
@過客
尊重人是最起碼的
--bns
4.?re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn)
帶有3種狀態(tài)CheckBox的樹形組件剛好用到
收了
--bns
5.?re: Spring Security 3.x 完整入門教程
AntUrlPathMatcher這個類所在jar包是哪個啊,是spring-security-core-tiger這個嗎?
--iechenyb
閱讀排行榜
1.?XFire完整入門教程(90499)
2.?Spring Security 3.x 完整入門教程(59175)
3.?使用XFire開發(fā)Web Service客戶端完整入門教程(52350)
4.?WebSphere6.1中使用Spring報(bào)cvc-elt.1: Cannot find the declaration of element 'beans'異常的解決辦法(24246)
5.?用MKVMerge GUI合并MKV文件(16687)
評論排行榜
1.?XFire完整入門教程(130)
2.?Spring Security 3.x 完整入門教程(67)
3.?使用XFire開發(fā)Web Service客戶端完整入門教程(33)
4.?VBA編程心得(24)
5.?JDK1.5API完整中文版CHM格式文檔發(fā)放(可下載)(22)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Robin's Programming World
主站蜘蛛池模板:
久久av免费天堂小草播放
|
亚洲无av在线中文字幕
|
69视频在线是免费观看
|
美女黄色免费网站
|
亚洲伊人久久大香线蕉啊
|
久久精品国产亚洲AV麻豆不卡
|
四虎1515hm免费国产
|
久久WWW免费人成人片
|
在线免费观看国产
|
a级毛片免费在线观看
|
国产高清对白在线观看免费91
|
亚洲精品无AMM毛片
|
亚洲综合激情另类小说区
|
亚洲av无码国产精品夜色午夜
|
无码不卡亚洲成?人片
|
国产一级大片免费看
|
青青青国产免费一夜七次郎
|
亚洲资源在线视频
|
亚洲av午夜福利精品一区
|
国产啪亚洲国产精品无码
|
国产性生交xxxxx免费
|
免费无遮挡无码视频网站
|
最近免费中文字幕4
|
免费中文熟妇在线影片
|
亚洲免费福利在线视频
|
免费观看无遮挡www的视频
|
91精品免费观看
|
久久ww精品w免费人成
|
暖暖免费在线中文日本
|
精品国产一区二区三区免费
|
97超高清在线观看免费视频
|
99久久99这里只有免费的精品
|
亚洲午夜无码久久久久
|
又黄又大又爽免费视频
|
成人亚洲综合天堂
|
日韩精品电影一区亚洲
|
亚洲高清无码综合性爱视频
|
亚洲国产成人a精品不卡在线
|
免费在线视频一区
|
相泽亚洲一区中文字幕
|
亚洲AV日韩AV天堂一区二区三区
|