Java 在Scala中,除了继承之外,还有什么技术可以知道何时调用了基类方法吗?

Java 在Scala中,除了继承之外,还有什么技术可以知道何时调用了基类方法吗?,java,scala,jvm,Java,Scala,Jvm,例如,假设我有以下基类,我无法修改其源代码 class Base { def someMethod = ... } 如果我定义一个子类 class Sub extends Base { override def someMethod = ... } 当我这样做的时候 val sub=新sub 然后我会自动“知道”何时调用了someMethod,因为sub.someMethod被触发。然而,我想避免子类化,所以我想知道是否有一些技术可以让我这样做 class NotSubcla

例如,假设我有以下基类,我无法修改其源代码

class Base {
    def someMethod = ...
}
如果我定义一个子类

class Sub extends Base {
    override def someMethod = ...
}
当我这样做的时候

val sub=新sub

然后我会自动“知道”何时调用了someMethod,因为sub.someMethod被触发。然而,我想避免子类化,所以我想知道是否有一些技术可以让我这样做

class NotSubclass {
    val Base = new Base
}
或类似

并且以某种方式从基中“附加”someMethod,以便NotSubclass在调用someMethod时“知道”。为了澄清某些方法是在外部调用的,我从不在自己的代码中进行调用。

你的意思是这样吗

class NotSubclass {
    val base = new Base

    def someMethod = base someMethod
}
你是说像这样

class NotSubclass {
    val base = new Base

    def someMethod = base someMethod
}

如果该方法属于某个接口,则可以重新实现该接口并包装基。否则您就倒霉了。

如果该方法属于某个接口,您可以重新实现该接口并包装Base。否则你就不走运了。

如果你正在修改一个没有源代码的类的行为,那么你可以试着研究它

方面允许您“包装”方法调用,以便可以记录信息、修改输入参数或返回值,甚至完全替换方法调用

如果您只想记录信息,那么这将是一个很好的方法。然而,如果您在任何地方都使用方面,它们可能导致代码很难理解和遵循,因此请确保它适合您的用例

您需要为感兴趣的方法定义一个


使用方面将代码编织到JDT中,它使用,因此它确实可以与Scala一起工作。

如果您正在修改一个没有源代码的类的行为,那么您可以尝试查看

方面允许您“包装”方法调用,以便可以记录信息、修改输入参数或返回值,甚至完全替换方法调用

如果您只想记录信息,那么这将是一个很好的方法。然而,如果您在任何地方都使用方面,它们可能导致代码很难理解和遵循,因此请确保它适合您的用例

您需要为感兴趣的方法定义一个


使用aspects将代码编织到JDT中,它使用,因此它可以与Scala一起工作。

我想您可以使用字节码操作来完成。PowerMock允许模拟构造函数,所以我猜同样的技术也可以用来替换Base的字节码,而这些字节码可以完成您需要完成的任何事情

这种方法当然将:

  • 对于任何不知道的人来说,这是非常令人困惑的
  • 如果没有控制类加载器,则失败
  • 可能会打破法律限制
  • 对于生产代码来说,这通常是个坏主意

    • 我想你可以通过字节码操作来实现。PowerMock允许模拟构造函数,所以我猜同样的技术也可以用来替换Base的字节码,而这些字节码可以完成您需要完成的任何事情

      这种方法当然将:

      • 对于任何不知道的人来说,这是非常令人困惑的
      • 如果没有控制类加载器,则失败
      • 可能会打破法律限制
      • 对于生产代码来说,这通常是个坏主意

      不完全是因为如果base.someMethod被外部调用,我希望NotSubclass.someMethod自动被调用。您的意思是,任何人调用
      base.someMethod
      ,无论他们是否有您的
      NotSubclass
      ,举个具体的例子,假设Base在实例化时自动开始获取股票市场数据。我希望每次在NotSubclass中更新价格时(通过someMethod)都能收到某种通知。这不完全是因为如果在外部调用base.someMethod,我希望NotSubclass.someMethod自动调用。您的意思是,任何时候有人调用
      base.someMethod
      ,不管他们是否有你的
      NotSubclass
      ?对于一个具体的例子,假设Base在实例化时自动开始获取股票市场数据。我希望在每次更新价格时(通过某种方法)都能收到某种通知NotSubclass@deltanovember:那么您不能更改源代码,但对已编译的类文件进行后处理可以吗?@deltanovember:那么您不能更改源代码,但对已编译的类文件进行后处理可以吗?