Robin's Programming World
I Love Programming As My Life!
BlogJava
首页
新随笔
联系
聚合
管理
随笔-193 评论-715 文章-1 trackbacks-0
Investigate getDeclaredMethod of Java Reflection
今天调试别人写的程序的时候,发现总出NoSuchMethodException,经过一翻跟踪,原来是getDeclaredMethod() 中报出来的,遂进行一翻调查:
假设我有两个类,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 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识该方法的形式参数类型。如果在某个类中声明了带有相同参数类型的多个方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则返回该方法;否则将从中任选一个方法。如果名称是
"
<init>” 或 “<clinit>
"
,则引发一个 NoSuchMethodException。
参数:
name
-
方法名
parameterTypes
-
参数数组
返回:
该类与指定名和参数相匹配的方法的 Method 对象
抛出:
NoSuchMethodException
-
如果找不到匹配的方法。
NullPointerException
-
如果 name 为
null
SecurityException
-
如果存在安全管理器 s,并满足下列任一条件:
调用 s.checkMemberAccess(
this
, Member.DECLARED) 拒绝访问已声明方法
调用方的类加载器不同于也不是该类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包
从以下版本开始:
JDK1.
1
这是为什么了?用javap来看看字节码:执行javap -c TestA 得到如下结果:
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
}
再执行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的字节码中,我们无法找到TestA中定义的tt()方法。我想这就是为什么了。
posted on 2010-08-12 14:48
Robin's Programming World
阅读(2466)
评论(3)
编辑
收藏
所属分类:
Java
评论:
#
re: Investigate getDeclaredMethod of Java Reflection 2010-08-12 16:39 |
路人
。。。
使用getMethod()就好了,获取所有公开的方法,包括父类的。
回复
更多评论
#
re: Investigate getDeclaredMethod of Java Reflection 2010-08-12 17:00 |
Robin's Java World
@路人
有个问题:我只想要指定的那一个,或许可以通过方法名来循环,但如果这个方法是重载的了?
回复
更多评论
#
re: Investigate getDeclaredMethod of Java Reflection
2010-08-13 15:35 |
狄浩
...当年写底层公用方法时候是用try(){}catch(){}反复回调自身函数来解决这个问题,现在算是知道什么原因了
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
相关文章:
Ubuntu环境下Apache2与Tomcat集成
Spring 3 MVC and JSON example
Android Media Player 深入观察
[转]编写高效的Android代码
Android程序完全退出的三种方法
使用ANT批量编译Flex应用和模块(Use ANT to batch compiling application and modules of Flex)
Investigate getDeclaredMethod of Java Reflection
Eclipse空心J图标的含义
Memcached Study Notes
BlazeDS自定义认证与权限控制
<
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)
转载(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)
相册
文章相关图片
收藏夹
other
Friend Links
Tiger's Space
Tiger的Blog,专注于过程改进,项目管理,质量管理三个方向。
zrfunds
搜索
积分与排名
积分 - 751608
排名 - 60
最新评论
1. re: XFire完整入门教程
楼主,请问你做过xfire使用spring的jdbc模板访问数据库的例子吗,急求啊?xfire和spring的结合在不访问数据库时(就像你这个例子一样)已经跑通了,但是需要使用jdbc时老出问题。谢谢
--fqjabc
2. re: 一次JQuery性能优化实战
不需要构建DOM
--bns
3. re: Spring Security 3.x 完整入门教程
@过客
尊重人是最起码的
--bns
4. re: Flex中带有三种状态CheckBox的Tree的实现
带有3种状态CheckBox的树形组件刚好用到
收了
--bns
5. re: Spring Security 3.x 完整入门教程
AntUrlPathMatcher这个类所在jar包是哪个啊,是spring-security-core-tiger这个吗?
--iechenyb
阅读排行榜
1. XFire完整入门教程(90434)
2. Spring Security 3.x 完整入门教程(59141)
3. 使用XFire开发Web Service客户端完整入门教程(52320)
4. WebSphere6.1中使用Spring报cvc-elt.1: Cannot find the declaration of element 'beans'异常的解决办法(24196)
5. 用MKVMerge GUI合并MKV文件(16667)
评论排行榜
1. XFire完整入门教程(130)
2. Spring Security 3.x 完整入门教程(67)
3. 使用XFire开发Web Service客户端完整入门教程(33)
4. VBA编程心得(24)
5. JDK1.5API完整中文版CHM格式文档发放(可下载)(22)