非常愚蠢的问题,我正在做一个项目,我无法考虑任何解决方法 我在 open jar中实现了新功能(我们称之为转换器),我想修改其中一种方法:ExchangeToEuro,ExchangeToDollar,CheckCurrency。
我的问题是:是否有任何机制可以在不修改jar的情况下向类添加功能(修改这些方法或甚至向这个类添加方法)(不修改jar中存在的类)? / p>
我想过一个类装饰器,但这不会起作用,因为我需要修改jar本身。
答案 0 :(得分:2)
您可以在Converter.jar中扩展类,只要它们不是最终的,并覆盖其中包含的方法,只要它们是可见的而不是最终的。说Converter.jar有这样一个类:
public class ExchangeToDollar {
public BigDecimal exchangeEuroToDollar(final BigDecimal euroValue) {
...method implementation....
}
}
您可以像这样扩展和覆盖:
public class MyClass extends ExchangeToDollar {
@Override
public BigDecimal exchangeEuroToDollar(final BigDecimal euroValue) {
...your implementation....
}
}
MyClass.exchangeEuroToDollar(BigDecimal)
方法会覆盖Converter.jar中exchangeEuroToDollar(BigDecimal)
类中包含的ExchangeToDollar
实现,这意味着当您在MyClass
的实例上调用该方法时,你的实施将被执行。
此类实现的缺点是,任何使用ExchangeToDollar
无法控制的代码都无法使用被覆盖的实现,除非您可以传递MyClass
实例代替。
答案 1 :(得分:1)
您需要做出哪些修改并不完全清楚,但是如果您需要自己修改类方法,那么您的选项仅限于使用AspectJ或使用BCEL或ASM等工具的不太简洁的字节代码操作形式。
您可以想象使用不同的JVM语言(如Groovy / etc)创建其他功能,编译为.class文件,然后使用它们。
但是,您可能需要提供更多和/或更少矛盾的信息。
答案 2 :(得分:1)
扩展类,添加所需的新功能,并覆盖应更改的内容。