关于反射的难题!!

追风筝的孩子 2012-06-12 11:07:51
以为对反射已经很了解,却还是遇到如下问题!!

A 有个onTounch方法。。
B 继承A 重写了onTounch方法,其中调用了super.onTounch方法

现在A,B均为系统的类,也就是说不可更改。

我的需求是,我需要继承B,并且重写自己的onTounch方法。

其中B里面的代码有百分之九十是我需要的,于是我把B的代码复制下来,里面用到的变量我直接用暴力反射给反射出来了。

但是因为B里面调用了A的方法。。


我也需要调用A的方法。。。但用反射得到该方法后,必须传递个对象进去,我传this进去的话就会执行自身的onTounch方法。比较蛋疼,有什么方法可以让我调用父类的父类的方法吗。。。。?
...全文
343 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
asia_deng 2012-06-15
  • 打赏
  • 举报
回复
楼主是想
试一下不用继承改用聚合
public class C extends A{
B b = new B();


}

或者
public class C {
B b = new B();
A a = new A();

}
十四月的清晨 2012-06-15
  • 打赏
  • 举报
回复
继承是指一个对象直接使用另一对象的属性和方法

继承了不就可以直接用了吗? 还复制神马?

不能用的重写。

没太懂楼主的意思,我是菜鸟,SORRY。
追风筝的孩子 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
楼主知道:
method.invoke(a.newInstance(), new Object[]{});
这里跟new a().onTouch()没啥区别。

也就明白 调用父类的父类的方法得怎么做,

所以楼主得先解决下面两个问题:
1、调用构造方法是创建对象吗?
2、创建子类对象时会不会创建其所有父类的对象?也即new C();会不会有A和B的对象生成?
[/Quote]调用构造方法不是创建对象吗?new C()有没有A,B对象生成我不确定,但确实会实现A,B的构造函数,愿听详解
追风筝的孩子 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用 11 楼 的回复:
引用 10 楼 的回复:
楼主知道:
method.invoke(a.newInstance(), new Object[]{});
这里跟new a().onTouch()没啥区别。

也就明白 调用父类的父类的方法得怎么做,

所以楼主得先解决下面两个问题:
1、调用构造方法是创建对象吗?
2、创建子类对象时会不会创建其所有父类的对象?也即new……
[/Quote]嗯。。你说得对。
lxbccsu 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 10 楼 的回复:
楼主知道:
method.invoke(a.newInstance(), new Object[]{});
这里跟new a().onTouch()没啥区别。

也就明白 调用父类的父类的方法得怎么做,

所以楼主得先解决下面两个问题:
1、调用构造方法是创建对象吗?
2、创建子类对象时会不会创建其所有父类的对象?也即new C();会不会有A和B的对象……
[/Quote]
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, 矛和盾又来了。

所以你想到了反射,于是回到了上面那点。

于是楼主就蛋疼了,有什么方法可以让我调用父类的父类的方法吗。。。。?
安特矮油 2012-06-15
  • 打赏
  • 举报
回复
完全不明白你的想法了,给出你现在的代码,还有你想实现的伪代码
qybao 2012-06-15
  • 打赏
  • 举报
回复
反射没用的,因为this本身是C对象,按多态还是会调用C自己的onTouch方法(结果应该会递归调用)
既然有A,B的代码,那就修改A,B后重新编译,如果不希望覆盖以前的A,B,那就新建一个package,然后C就继承新的package的B,有时候费那么大工夫去研究一些问题,还不如转个弯改变一下思路
追风筝的孩子 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
不知道你是不是这个意思
Java code

class A{
public A(){}
protected void onTouch() {
System.out.println("A method onTouch!");
}

}
class B extends A{
public B(){}
protec……
[/Quote]

method.invoke(a.newInstance(), new Object[]{});


这里跟new a().onTouch()没啥区别。我要的是c调用那段代码。。因为c里面有些变量是来自a的。。,调用后那些变量会有变化。而你那个跟c没关系。。只是执行了一段属于他自己的代码,他自己的变量变化了与c无关
安特矮油 2012-06-14
  • 打赏
  • 举报
回复
不知道你是不是这个意思

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();
}

}
}
阿冷 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
别传this,传个B的对象,试试。
你反射得到的B的对象。
我是继承B的,也就是说我写的那个类只能传this。。。omg
[/Quote]

实在不行,不重写B的onTounch方法,写个新方法,onTounch1(用的时候调这个)之类的,这样传this,能满足你需求不
追风筝的孩子 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
别传this,传个B的对象,试试。
你反射得到的B的对象。
[/Quote]我是继承B的,也就是说我写的那个类只能传this。。。omg
lxbccsu 2012-06-14
  • 打赏
  • 举报
回复
楼主知道:
method.invoke(a.newInstance(), new Object[]{});
这里跟new a().onTouch()没啥区别。

也就明白 调用父类的父类的方法得怎么做,

所以楼主得先解决下面两个问题:
1、调用构造方法是创建对象吗?
2、创建子类对象时会不会创建其所有父类的对象?也即new C();会不会有A和B的对象生成?

阿冷 2012-06-13
  • 打赏
  • 举报
回复
别传this,传个B的对象,试试。
你反射得到的B的对象。
追风筝的孩子 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 trocp 的回复:]
既然C继承了父类B的方法,那类C中只覆盖B的onTounch()方法就可以了

为啥非要用反射,难倒B是final class?
[/Quote]因为B类和A类的代码我都无法写,算法复杂。就算复制下来也报错,因为很多私有的成员变量。我现在的方法就是把A类的onTouch方法里面的代码也复制下来。。然后继续反射。。。
追风筝的孩子 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
即然类B的onTounch方法,有百分之九十是需要的,那就把这百分之九十的代码独立出来一个方法叫 onTounch1吧。
类B的onTounch就剩下百分之十了,剩下的调用onTounch1就行了。

继承自类B的类叫类C吧,类C继承B,也就继成了onTounch1方法。

需要用A的方法,可以在C类的new一下A类的实例哦,没有问题吧。不new实例,也可以把A类的对应的方法写成stat……
[/Quote]。。。我对你无语了。。。你没看清题目
brightyq 2012-06-12
  • 打赏
  • 举报
回复
即然类B的onTounch方法,有百分之九十是需要的,那就把这百分之九十的代码独立出来一个方法叫 onTounch1吧。
类B的onTounch就剩下百分之十了,剩下的调用onTounch1就行了。

继承自类B的类叫类C吧,类C继承B,也就继成了onTounch1方法。

需要用A的方法,可以在C类的new一下A类的实例哦,没有问题吧。不new实例,也可以把A类的对应的方法写成static的,直接用,也不用new实例了。
总之这是代码结构上的问题,几个A的层次安排好,不算是反射的问题了。
oO临时工Oo 2012-06-12
  • 打赏
  • 举报
回复
既然C继承了父类B的方法,那类C中只覆盖B的onTounch()方法就可以了

为啥非要用反射,难倒B是final class?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧