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