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() 中報出來的,遂進行一翻調(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ù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(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圖標的含義
Memcached Study Notes
BlazeDS自定義認證與權(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,專注于過程改進,項目管理,質(zhì)量管理三個方向。
zrfunds
搜索
積分與排名
積分 - 754671
排名 - 60
最新評論
1.?re: XFire完整入門教程
樓主,請問你做過xfire使用spring的jdbc模板訪問數(shù)據(jù)庫的例子嗎,急求???xfire和spring的結(jié)合在不訪問數(shù)據(jù)庫時(就像你這個例子一樣)已經(jīng)跑通了,但是需要使用jdbc時老出問題。謝謝
--fqjabc
2.?re: 一次JQuery性能優(yōu)化實戰(zhàn)
不需要構(gòu)建DOM
--bns
3.?re: Spring Security 3.x 完整入門教程
@過客
尊重人是最起碼的
--bns
4.?re: Flex中帶有三種狀態(tài)CheckBox的Tree的實現(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報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免费不卡国产观看
|
五月天网站亚洲小说
|
国产a视频精品免费观看
|
jizzjizz亚洲日本少妇
|
亚洲Av无码专区国产乱码DVD
|
亚洲性线免费观看视频成熟
|
亚洲av成人中文无码专区
|
黑人精品videos亚洲人
|
欧美a级成人网站免费
|
三级毛片在线免费观看
|
亚洲一区中文字幕
|
久久久无码精品亚洲日韩软件
|
a国产成人免费视频
|
亚洲中文字幕AV每天更新
|
亚洲热妇无码AV在线播放
|
国产1024精品视频专区免费
|
www在线观看播放免费视频日本
|
亚洲日本香蕉视频
|
国产亚洲精品成人AA片新蒲金
|
一级一片免费视频播放
|
亚洲婷婷天堂在线综合
|
国产啪亚洲国产精品无码
|
国产成人免费网站
|
伊人久久免费视频
|
一级毛片免费一级直接观看
|
91亚洲国产成人久久精品
|
久久久久亚洲精品无码网址
|
午夜视频免费成人
|
精品女同一区二区三区免费站
|
国产精品无码免费专区午夜
|
亚洲日韩乱码中文字幕
|
亚洲综合久久久久久中文字幕
|
红杏亚洲影院一区二区三区
|
在线播放免费人成视频在线观看
|
最近免费视频中文字幕大全
|
最近中文字幕免费大全
|
日本激情猛烈在线看免费观看
|
亚洲日韩精品无码AV海量
|
亚洲欧洲精品久久
|
亚洲人成电影在在线观看网色
|