Java通过接口调用方法的时候,怎么知道调用的是哪个实现类里的方法?
天蓬老师
天蓬老师 2017-04-17 11:44:48
[Java讨论组]

一个抽象接口,有很多实现类,通过接口调用某个方法的时候,怎么知道调用的是哪个实现类里的方法?

谢谢。


2014-07-02 更新

前三个回答是可以,不过依然没有找到我想要的答案。比如在Eclipse里查看别人的jar包里的源码,对于接口调用方法情况,如果直接按ctrl点进去查看源码,往往只能看到接口里方法的声明,无法获知具体调用的是哪个实现类的方法,特别是实现类非常多的情况,虽然这是Java多态的体现,但,有没有工具可以在非调试状态下知道调用是哪个实现类里的方法?


天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
PHP中文网

用对象的 getClass() 方法获得它的类,之后就可以随意去判断这是哪个实现类了。


多态是运行时的概念,在运行前是不可能知道究竟会使用哪个实现的。你能做的只是找到所有实现这个 interface 的类然后从逻辑上猜测大概会是哪个。

怪我咯

也可以使用instanceof判断

ringa_lee

反射 or 把所有类都创建单个实例用hashmap存储

大家讲道理

理论上可以,可用reflection等办法。

但据我所知,eclipse不支持你想要的功能。
原因是多态的特性使得对象的真实类型只能到运行时(runtime)才能被JVM确定。而eclipse的绝大多数refactoring和declaration jumping都是基于semantics的,也就是只能依靠在编译时(compile time)所能获得的信息。因此编译时获取的信息有有时只能推断到接口或者父类,这样就无法在编译时确定真实类型。eclipse对此无能为力,intelliJ也不行。

天蓬老师

以spring框架注入bean说明
接口TestService
有2个实现类 TestServiceImp1 @Service("TestService1")
,TestServiceImp2 @Service("TestService2")
在controller里注入server的bean时使用注释@Qualifier指明使用的实现类

@Autowired
@Qualifier("TestService1")
TestService testService;
则调用具体代码时
testService.test();
//此时使用的是TestServiceImp1实现类里的test方法,但是用eclipse查看源码时会显示2个实现类要你选择

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号