V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ymj123
V2EX  ›  程序员

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

  •  
  •   ymj123 · 2019-01-24 23:38:17 +08:00 via Android · 1866 次点击
    这是一个创建于 2129 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    各位有什么建议吗?

    11 条回复    2019-01-25 14:11:03 +08:00
    DovaKeen
        1
    DovaKeen  
       2019-01-25 08:44:02 +08:00
    能不能 b.get(){
    super.get();
    // 鉴权
    }这样
    或者把 A 里的私有方法改成 protected ?
    zzxCNCZ
        2
    zzxCNCZ  
       2019-01-25 09:23:59 +08:00
    super 调用下?
    richieboy
        3
    richieboy  
       2019-01-25 09:33:44 +08:00
    继承,然后不符合要求的方法自己重写?
    zifangsky
        4
    zifangsky  
       2019-01-25 09:41:54 +08:00
    1、面向切面( AOP )了解一下;
    2、反射+动态代理了解一下。
    skypyb
        5
    skypyb  
       2019-01-25 09:45:24 +08:00
    楼上们说的方法只能在不改变原有 get()方法逻辑的基础上在代码前 /后加逻辑吧。
    要是需要修改原先逻辑...好像没啥好方法
    ymj123
        6
    ymj123  
    OP
       2019-01-25 10:16:41 +08:00 via Android
    @skypyb 对的,要改原先逻辑,不是在原先逻辑前后加代码就行了。
    ymj123
        7
    ymj123  
    OP
       2019-01-25 10:19:00 +08:00 via Android
    @DovaKeen 不能改 A 类里的代码,只能新增类。
    ymj123
        8
    ymj123  
    OP
       2019-01-25 10:19:32 +08:00 via Android
    @zifangsky 这么说有点头绪了。
    peyppicp
        9
    peyppicp  
       2019-01-25 10:26:05 +08:00
    直接用反射拿到方法就行了
    MrLeion
        10
    MrLeion  
       2019-01-25 11:12:42 +08:00
    通过继承是拿不到父类的 私有方法的。
    如果不能变更 A.java 的话:建议使用 静 /动态代理,或者 ASM/Javasist 等字节码操作库也是可以实现类似的功能的;
    如果可以变更 A.java 的话:建议添加一个 getXxx 方法把鉴权信息,兼容该对象之前的功能;
    DovaKeen
        11
    DovaKeen  
       2019-01-25 14:11:03 +08:00
    话说回来如果有相似的代码复制粘贴是不是说明设计的不好,,违背了一些面向对象的原则,以后维护会很麻烦的,,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2776 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:56 · PVG 20:56 · LAX 04:56 · JFK 07:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.