子类通过父类的Method对象的invoke执行的还是自己的方法
2017-03-26 21:09
357 查看
这个问题是在看一段cglib demo时发现的:
intercept方法中有一句:proxy.involeSuper(obj,args);我想到为什么不直接用m.invoke(obj,args);因为那个m就是父类的方法啊。试了一下发现循环调用intercept了,所以猜想可能因为obj是Train的子类,所以就算Method对象是父类的最终也会执行到子类的Method。
然后为了验证,写了个test:
public class Father {
public void say() {
System.out.println("I am father");
}
}
输出是:I am son.
证明了上面那个结论是对的
public class Train { public void move(){ System.out.println("火车行驶中..."); } }
public class CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); private Object object; public Object getProxy(Class clazz){ //设置创建子类的类 enhancer.setSuperclass(clazz); enhancer.setCallback(this);//主要是为了intercept可以被回调 return enhancer.create(); } /** * 拦截所有目标类方法的调用 * obj 目标类的实例(是已经被增强的子类,该子类中的对应的方法都被增强了,也就是说都调用了这个intercept方法,所以如果在这个方法(intercept)中使用m.invoke(obj,args)就会循环调用) * m 目标方法的反射对象 * args 方法的参数 * proxy代理类的实例(生成的代理类对方法的代理引用) */ @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("日志开始..."); //代理类调用父类的方法 proxy.invokeSuper(obj, args); System.out.println("日志结束..."); return null; } }
public class Client { /** * @param args */ public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); Train t = (Train)proxy.getProxy(Train.class);//生成Train的一个(添加了回调方法的)子类(作为代理) t.move(); } }
intercept方法中有一句:proxy.involeSuper(obj,args);我想到为什么不直接用m.invoke(obj,args);因为那个m就是父类的方法啊。试了一下发现循环调用intercept了,所以猜想可能因为obj是Train的子类,所以就算Method对象是父类的最终也会执行到子类的Method。
然后为了验证,写了个test:
public class Father {
public void say() {
System.out.println("I am father");
}
}
public class Son extends Father{ public void say() { System.out.println("I am son"); } public static void main(String[] args) { try { Method sayMethod = Father.class.getDeclaredMethod("say"); Son son = new Son(); sayMethod.invoke(son,null); } catch (Exception e){ e.printStackTrace(); } } }
输出是:I am son.
证明了上面那个结论是对的
相关文章推荐
- 关于java中子类,父类中,静态代码块: staic{},动态代码块:{},构造方法,类属性,对象属性等执行顺序做个总结:
- 【Java面试题】42 TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
- Java反射:通过父类对象调用子类方法
- Java中子类在继承父类时所继承的属性和方法是和父类共用还是归属于自己
- TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
- 子类继承父类时,子类与父类有同名变量,当使用子类对象调用父类方法使用同名变量,这个变量是子类的,还是父类的?(转)
- Objective-C中的NSObject对象经常使用到的方法-判断父类子类关系
- 通过反射访问对象的私有变量和执行私有方法
- 通过Type.InvokeMethod实现方法的重载
- java中通过反射获取方法并且调用(getMethod和invoke深入)实践
- C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法
- 执行shell脚本的多种方法及重要区别---摘取自“老男孩linux运维培训”(自己通过视频整理)
- java 通过子类怎么调用父类已经被重写的方法
- Java对象的构造过程---子类继承父类时(非)静态块及构造函数等的执行顺序
- 黑马程序员--java中父类和子类都有构造方法时,子类对象的初始化过程
- OO 中的继承分析:主要分析在编译和运行过程中 子类、父类 的字段和方法以及实例化时候在内存中分配 和 执行的先后,以及两个原则
- WorkFlow设计篇Step.6—InvokeMethod调用对象或类型方法-WF4.0
- 一个子类要调用父类的方法时,默认是使用this还是super?
- java中 静态成员、实例成员、构造方法在子类和父类中的执行顺序
- Java继承中父类子类构造方法、静态代码块、非静态代码块的执行顺序