菜鸟问个关于 Java 继承的问题

2019-01-24 23:38:17 +08:00
 ymj123

我要给某个项目加功能,源码是 Java 写的,有的地方我要加上鉴权服务,比如 A.java 里有个方法 get(),我要改 get()方法,在其中加入鉴权的代码,其实就是 header 里加一个参数,但是这个 get()方法里用到了 A.java 中的私有方法。 如果我写一个类 ASon.java 继承 A.java,重写 get()方法,那其中就会用到 A 类中的私有方法,这些私有的方法又继承不下来,我还得再写一遍。感觉还不如直接新建一个 B.java,把 A.java 的代码都抄过来,然后改 get()方法。

各位有什么建议吗?

1706 次点击
所在节点    程序员
11 条回复
DovaKeen
2019-01-25 08:44:02 +08:00
能不能 b.get(){
super.get();
// 鉴权
}这样
或者把 A 里的私有方法改成 protected ?
zzxCNCZ
2019-01-25 09:23:59 +08:00
super 调用下?
richieboy
2019-01-25 09:33:44 +08:00
继承,然后不符合要求的方法自己重写?
zifangsky
2019-01-25 09:41:54 +08:00
1、面向切面( AOP )了解一下;
2、反射+动态代理了解一下。
skypyb
2019-01-25 09:45:24 +08:00
楼上们说的方法只能在不改变原有 get()方法逻辑的基础上在代码前 /后加逻辑吧。
要是需要修改原先逻辑...好像没啥好方法
ymj123
2019-01-25 10:16:41 +08:00
@skypyb 对的,要改原先逻辑,不是在原先逻辑前后加代码就行了。
ymj123
2019-01-25 10:19:00 +08:00
@DovaKeen 不能改 A 类里的代码,只能新增类。
ymj123
2019-01-25 10:19:32 +08:00
@zifangsky 这么说有点头绪了。
peyppicp
2019-01-25 10:26:05 +08:00
直接用反射拿到方法就行了
MrLeion
2019-01-25 11:12:42 +08:00
通过继承是拿不到父类的 私有方法的。
如果不能变更 A.java 的话:建议使用 静 /动态代理,或者 ASM/Javasist 等字节码操作库也是可以实现类似的功能的;
如果可以变更 A.java 的话:建议添加一个 getXxx 方法把鉴权信息,兼容该对象之前的功能;
DovaKeen
2019-01-25 14:11:03 +08:00
话说回来如果有相似的代码复制粘贴是不是说明设计的不好,,违背了一些面向对象的原则,以后维护会很麻烦的,,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/530421

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX