以为对反射已经很了解,却还是遇到如下问题!!A 有个onTounch方法。。
B 继承A 重写了onTounch方法,其中调用了super.onTounch方法现在A,B均为系统的类,也就是说不可更改。我的需求是,我需要继承B,并且重写自己的onTounch方法。其中B里面的代码有百分之九十是我需要的,于是我把B的代码复制下来,里面用到的变量我直接用暴力反射给反射出来了。但是因为B里面调用了A的方法。。
我也需要调用A的方法但用反射得到该方法后,必须传递个对象进去,我传this进去的话就会执行自身的onTounch方法。比较蛋疼,有什么方法可以让我调用父类的父类的方法吗。?
B 继承A 重写了onTounch方法,其中调用了super.onTounch方法现在A,B均为系统的类,也就是说不可更改。我的需求是,我需要继承B,并且重写自己的onTounch方法。其中B里面的代码有百分之九十是我需要的,于是我把B的代码复制下来,里面用到的变量我直接用暴力反射给反射出来了。但是因为B里面调用了A的方法。。
我也需要调用A的方法但用反射得到该方法后,必须传递个对象进去,我传this进去的话就会执行自身的onTounch方法。比较蛋疼,有什么方法可以让我调用父类的父类的方法吗。?
类B的onTounch就剩下百分之十了,剩下的调用onTounch1就行了。继承自类B的类叫类C吧,类C继承B,也就继成了onTounch1方法。需要用A的方法,可以在C类的new一下A类的实例哦,没有问题吧。不new实例,也可以把A类的对应的方法写成static的,直接用,也不用new实例了。
总之这是代码结构上的问题,几个A的层次安排好,不算是反射的问题了。
你反射得到的B的对象。
实在不行,不重写B的onTounch方法,写个新方法,onTounch1(用的时候调这个)之类的,这样传this,能满足你需求不
public A(){}
protected void onTouch() {
System.out.println("A method onTouch!");
}
}
class B extends A{
public B(){}
protected void onTouch() {
System.out.println("B method onTouch!");
super.onTouch();
}
}
class C extends B{
public C(){}
protected void onTouch() {
System.out.println("C method onTouch!");
Class a = A.class;
try {
Method method = a.getDeclaredMethod("onTouch", new Class[]{});
method.invoke(a.newInstance(), new Object[]{});
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
method.invoke(a.newInstance(), new Object[]{});
这里跟new a().onTouch()没啥区别。我要的是c调用那段代码。。因为c里面有些变量是来自a的。。,调用后那些变量会有变化。而你那个跟c没关系。。只是执行了一段属于他自己的代码,他自己的变量变化了与c无关
method.invoke(a.newInstance(), new Object[]{});
这里跟new a().onTouch()没啥区别。也就明白 调用父类的父类的方法得怎么做,所以楼主得先解决下面两个问题:
1、调用构造方法是创建对象吗?
2、创建子类对象时会不会创建其所有父类的对象?也即new C();会不会有A和B的对象生成?
试一下不用继承改用聚合
public class C extends A{
B b = new B();
}或者
public class C {
B b = new B();
A a = new A();
}
既然有A,B的代码,那就修改A,B后重新编译,如果不希望覆盖以前的A,B,那就新建一个package,然后C就继承新的package的B,有时候费那么大工夫去研究一些问题,还不如转个弯改变一下思路
2、这点个人的理解是new C不会创建其父类对象A, B。另外,反射method.invoke调用的是指定object的这个method, 当你new C().onTounch()时(自然此时方法中的this是这个调用对象),在onTounch()中你想用method.invoke调用A的方法(调用父类的父类的方法), 那自然得用A的object(区分instanceof 和 getClass),而A类型的对象在你的这个继承体系中就个C的this,C又重写了onTounch,矛和盾就来了。Java中,子类调用父类方法是 super.方法 (至于super会指哪个父类,得看实际情况),没有 super.super.方法 的语法,而B重写了A的onTounch,又不想调用B的onTounch, 矛和盾又来了。所以你想到了反射,于是回到了上面那点。于是楼主就蛋疼了,有什么方法可以让我调用父类的父类的方法吗。?