当继承遇到反射
2016-01-22 09:33
471 查看
当继承遇到反射
标签 : Java起因:使用EventBus库时,只是在父类中注册了监听事件,把this传递过去了:EventBus.getDefault().register(this),子类中并没有注册监听事件,但在响应时调用的却是子类中的响应方法,EventBus是用反射来获取注册监听器的类的方法表然后调用相关方法的,因此写了个继承与反射的例子来分析一下。
/* A.java */ public class A { public void foo() { } }
/* B.java */ public class B extends A { public void foo() { } public void foo2() { } public void foo3() { } }
public class Program { public static void main(String[] args) { A obj = new B(); Class<?> clazz = obj.getClass(); Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } } }
输出:
foo foo3 foo2 wait wait wait equals toString hashCode getClass notify notifyAll
这里得到的方法列表是B类中的方法。
解释:
因为 A obj = new B() , obj的实际类型是B,obj调用getClass()方法时,由于链接时的动态绑定,obj.getClass()方法被重新定向到了类B#getClass()方法的方法调用入口,所以obj.getClass()实际执行的是B#getClass()函数,因此得到的是B的Class实例。因此 clazz.getMethods() 得到的自然是类B的方法表了。
关于"this":
在类A中添加方法:public void fuck() { System.out.println(this); System.out.println(this.getClass().getName()); }
在main()方法中调用fuck():
A obj = new B(); obj.fuck();
输出:
test.demo.B@15db9742 test.demo.B
在A类中的this被重新定向到了B类的实例。
解释:
类B继承类A,同对getClass()函数的分析一样,类B在编译时自动拷贝了类A中的所有方法,类B没有显示地重写fuck()函数,因此在类B内也有一份与类A中fuck()函数相同的fuck()函数的拷贝。在执行obj.fuck()时,由于链接时的动态绑定obj.fuck()方法被重新定向到了类B#fuck()方法的方法调用入口,所以obj.fuck(),实际执行的是B#fuck()函数,因此A.java文件中fuck()函数的this是B的实例也就不足为奇了,因为obj.fuck()方法不是调用类A而是调用类B中的fuck()。相关文章推荐
- getX()和getRawX()的区别
- Linux---LAMP搭建Discuz!
- Umbraco(4)-Outputting the Document Type Properties
- Java日期格式处理
- swift可选链
- memcache的一致性hash算法使用
- CSDN头版头条 《近匠》 Wijmo 5 CTO:从Web到移动,我的25年编程生涯
- 关于webapi加入Route引用出现问题的解决方案
- onWindowFocusChanged重要作用(得到/失去焦点call) 、
- jQuery Form 表单提交插件-----formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的 应用
- linux安装apache过程中注意的问题
- root权限是
- Educational Codeforces Round 6 题解&&代码
- Umbraco(4)-Outputting the Document Type Properties
- Android LK Bootlaoder启动概览
- Hibernate 与mybatis的区别
- mysql
- swift自动引用计数
- 工厂方法模式(factory method pattern)
- 如何面对苦逼的人生