【问题标题】:Adding methods/modifying classes of a jar添加方法/修改jar的类
【发布时间】:2011-10-03 22:43:17
【问题描述】:

非常愚蠢的问题,我正在做一个项目,我想不出任何解决方法 我在 open jar 中实现了新功能(我们称之为转换器),我想修改以下方法之一:ExchangeToEuro、ExchangeToDollar、CheckCurrency。

我的问题是:是否有任何机制可以在不修改 jar(不修改 jar 中存在的类)的情况下向类添加功能(修改这些方法甚至向此类添加方法)?

我想到了一个类装饰器,但这行不通,因为我需要修改 jar 本身。

【问题讨论】:

    标签: java jar


    【解决方案1】:

    您可以在 Converter.jar 中扩展类,只要它们不是 final 的,并覆盖其中包含的方法,只要它们是可见的并且不是 final 的。假设 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 中 ExchangeToDollar 类中包含的 exchangeEuroToDollar(BigDecimal) 实现,这意味着当您在 MyClass 的实例上调用该方法时,您的实现将被执行。

    这种实现类型的缺点是任何您无法控制的使用ExchangeToDollar 的代码将无法使用您的覆盖实现,除非您可以传递MyClass 实例。

    【讨论】:

    • 是的,这很糟糕,我希望能够使用新的实现而不是旧的......
    • 好吧,您可以使用新的实现,但您无法控制的类可能无法使用。
    【解决方案2】:

    尚不完全清楚您需要进行什么样的修改,但如果您需要修改类方法本身,您的选择仅限于 AspectJ 或使用 BCEL 或 ASM 等工具的不太干净的字节码操作形式.

    您可以想象用不同的 JVM 语言(如 Groovy/等)创建附加功能,编译为 .class 文件并使用这些文件。

    不过,您可能需要提供更多和/或更少矛盾的信息。

    【讨论】:

    • ehehe 抱歉,Dave,我也不知道怎么解释!所以我有一个 jar(打开,例如我可以打开它并修改 java/class 文件)它包含一个类列表,一个在这个包中,名为“org.conversion” 其中一个类称为 Conversion 并具有方法我列出了 ExchangeToEuro、ExchangeToDollar、CheckCurrency。我想修改其中一个,而不修改jar中的类。
    • 那么请看 Ioeth 的回答;够了吗?否则,事情会变得复杂。
    • 好吧,恐怕这是一半的答案..就像我正在研究的那样,似乎不可能做到我所说的......
    • 因为你说你想在不修改 jar 的情况下修改 jar 中的类——这几乎是不可能的,是的。如果您不能子类化和覆盖,不能使用 Spring AOP 之类的东西(可以使用代理玩游戏)进行包装,您的选择是(1)通过字节码操作(最好通过 AspectJ 之类的东西)修改 jar 或( 2) 使用加载时编织修改类(jar 未修改;在加载期间操作字节码)。
    【解决方案3】:

    扩展类,添加所需的新功能,并覆盖应该更改的功能。

    【讨论】:

    • 好吧,我试过了,(见上面的评论),我希望旧 jar 使用新功能 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多