以为对反射已经很了解,却还是遇到如下问题!!A 有个onTounch方法。。
B 继承A  重写了onTounch方法,其中调用了super.onTounch方法现在A,B均为系统的类,也就是说不可更改。我的需求是,我需要继承B,并且重写自己的onTounch方法。其中B里面的代码有百分之九十是我需要的,于是我把B的代码复制下来,里面用到的变量我直接用暴力反射给反射出来了。但是因为B里面调用了A的方法。。
我也需要调用A的方法但用反射得到该方法后,必须传递个对象进去,我传this进去的话就会执行自身的onTounch方法。比较蛋疼,有什么方法可以让我调用父类的父类的方法吗。?

解决方案 »

  1.   

    既然C继承了父类B的方法,那类C中只覆盖B的onTounch()方法就可以了为啥非要用反射,难倒B是final class?
      

  2.   

    即然类B的onTounch方法,有百分之九十是需要的,那就把这百分之九十的代码独立出来一个方法叫 onTounch1吧。
    类B的onTounch就剩下百分之十了,剩下的调用onTounch1就行了。继承自类B的类叫类C吧,类C继承B,也就继成了onTounch1方法。需要用A的方法,可以在C类的new一下A类的实例哦,没有问题吧。不new实例,也可以把A类的对应的方法写成static的,直接用,也不用new实例了。
    总之这是代码结构上的问题,几个A的层次安排好,不算是反射的问题了。
      

  3.   

    因为B类和A类的代码我都无法写,算法复杂。就算复制下来也报错,因为很多私有的成员变量。我现在的方法就是把A类的onTouch方法里面的代码也复制下来。。然后继续反射
      

  4.   

    别传this,传个B的对象,试试。
    你反射得到的B的对象。
      

  5.   

    我是继承B的,也就是说我写的那个类只能传thisomg
      

  6.   


    实在不行,不重写B的onTounch方法,写个新方法,onTounch1(用的时候调这个)之类的,这样传this,能满足你需求不
      

  7.   

    不知道你是不是这个意思class A{
    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();
    }

    }
    }
      

  8.   


         method.invoke(a.newInstance(), new Object[]{});
    这里跟new a().onTouch()没啥区别。我要的是c调用那段代码。。因为c里面有些变量是来自a的。。,调用后那些变量会有变化。而你那个跟c没关系。。只是执行了一段属于他自己的代码,他自己的变量变化了与c无关
      

  9.   

    楼主知道:
    method.invoke(a.newInstance(), new Object[]{});
    这里跟new a().onTouch()没啥区别。也就明白  调用父类的父类的方法得怎么做,所以楼主得先解决下面两个问题:
    1、调用构造方法是创建对象吗?
    2、创建子类对象时会不会创建其所有父类的对象?也即new C();会不会有A和B的对象生成?
      

  10.   

    调用构造方法不是创建对象吗?new C()有没有A,B对象生成我不确定,但确实会实现A,B的构造函数,愿听详解
      

  11.   

    继承是指一个对象直接使用另一对象的属性和方法继承了不就可以直接用了吗? 还复制神马?不能用的重写。没太懂楼主的意思,我是菜鸟,SORRY。
      

  12.   

    楼主是想
    试一下不用继承改用聚合
    public class C extends A{
       B b = new B();
       
       
    }或者
    public class C {
       B b = new B();
       A a = new A();
       
    }
      

  13.   

    反射没用的,因为this本身是C对象,按多态还是会调用C自己的onTouch方法(结果应该会递归调用)
    既然有A,B的代码,那就修改A,B后重新编译,如果不希望覆盖以前的A,B,那就新建一个package,然后C就继承新的package的B,有时候费那么大工夫去研究一些问题,还不如转个弯改变一下思路
      

  14.   

    1、调用构造方法不是创建对象,只是初始化参数。
    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, 矛和盾又来了。所以你想到了反射,于是回到了上面那点。于是楼主就蛋疼了,有什么方法可以让我调用父类的父类的方法吗。?