Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加方法/修改jar的类_Java_Jar - Fatal编程技术网

Java 添加方法/修改jar的类

Java 添加方法/修改jar的类,java,jar,Java,Jar,非常愚蠢的问题,我正在做一个项目,我想不出任何解决办法 我已经在一个开放jar中实现了新的函数(我们称之为转换器),我想修改以下方法之一:ExchangeToEuro、ExchangeToDollar、CheckCurrency 我的问题是:是否有任何机制可以在不修改jar(不修改jar中的类)的情况下向类添加功能(修改这些方法中的一个,甚至向这个类添加方法) 我考虑过使用类装饰器,但这不起作用,因为我需要修改jar本身。不完全清楚需要进行什么样的修改,但是如果需要修改类方法本身,您的选项仅限于

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

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


我考虑过使用类装饰器,但这不起作用,因为我需要修改jar本身。

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

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


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

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

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


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

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

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

您可以在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....
    }
}
您可以像这样扩展和覆盖:

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中
ExchangeEUROTOLLAR(BigDecimal)
类中包含的
ExchangeToDollar
实现,这意味着当您在
MyClass
的实例上调用该方法时,将执行您的实现


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

您可以在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....
    }
}
您可以像这样扩展和覆盖:

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中
ExchangeEUROTOLLAR(BigDecimal)
类中包含的
ExchangeToDollar
实现,这意味着当您在
MyClass
的实例上调用该方法时,将执行您的实现


这种类型的实现的缺点是,您无法控制的任何使用
ExchangeTodaular
的代码都将无法使用您的重写实现,除非您可以将
MyClass
实例传入。

ehe抱歉,Dave,我都不知道如何解释它!因此,我有一个jar(打开,例如,我可以打开它并修改java/类文件),它包含一个类列表,一个在这个名为“org.conversion”的包中,其中一个类称为conversion,它的方法我列出了ExchangeToEuro、ExchangeToDollar、CheckCurrency。我想修改其中一个,而不修改jar中的类;足够吗?如果没有,事情会变得复杂的。嗯,恐怕这是答案的一半。。就像我正在研究的那样,要做到我说的似乎是不可能的……因为你说你想在不修改jar的情况下修改jar中的类——这几乎是不可能的,是的。如果您不能子类化和重写,不能使用Spring AOP(可以与代理玩游戏)之类的工具进行包装,那么您可以选择(1)通过字节码操作(最好是通过AspectJ之类的工具)修改jar,或者(2)使用加载时编织修改类(jar未修改;加载期间操作字节码),我都不知道该怎么解释!因此,我有一个jar(打开,例如,我可以打开它并修改java/类文件),它包含一个类列表,一个在这个名为“org.conversion”的包中,其中一个类称为conversion,它的方法我列出了ExchangeToEuro、ExchangeToDollar、CheckCurrency。我想修改其中一个,而不修改jar中的类;足够吗?如果没有,事情会变得复杂的。嗯,恐怕这是答案的一半。。就像我正在研究的那样,要做到我说的似乎是不可能的……因为你说你想在不修改jar的情况下修改jar中的类——这几乎是不可能的,是的。如果您不能子类化和重写,不能使用Spring AOP(它可以与代理玩游戏)之类的工具进行包装,那么您的选项是(1)通过字节码操作(最好是通过AspectJ之类的工具)修改jar,或者(2)使用加载时编织(jar未修改;加载过程中操作字节码)。是的,这是最糟糕的,我希望能够使用新的实现,而不是旧的实现…好吧,你可以使用新的实现,但是你控制之外的类可能无法使用。是的,这很糟糕,我希望能够使用新的实现,而不是旧的实现…好吧,你可以使用新的实现,但是,您无法控制的类可能不是