我可以从Java类文件中删除枚举值吗?

问题描述 投票:1回答:1

可以说我有一个较大的Java应用程序的jar文件,但我无法从源代码重新生成。让我们还规定,我想通过消除导致该问题的枚举值来修改应用程序不良行为的一个方面。我可以从相应的.class文件中删除其中一个枚举值,重新创建它所属的jar,并实现仍在运行的应用程序的目标吗?有什么方法可以实现这一目标以及可能存在哪些缺点?

只需要使用JDK中提供的工具的答案比需要额外的工具(例如this question中列出的工具)更可取。如果有答案,这个similar question会很有用。

对执行反射,动态字节码操作或对枚举值ala this question进行运行时修改的应用程序的更改是非启动程序。

java enums bytecode bytecode-manipulation
1个回答
2
投票

最有可能:不可能。

但我无法从源头重新生成

换句话说:您无法将其编译为“项目”。因此,您缺乏这样的项目定义所带来的基本工具(例如:轻松访问“用法”和轻松重构)。

让我们假设你以某种方式设法将一个Enum java文件编译成一个类文件。当它工作时,当然,你可以进入,删除相应的常量,构建一个新的.class文件,并操纵你现有的JAR文件来使用它。

但最大的缺点是:你不知道有多少其他类正在使用那个特定的常量。也许,使用javap和grep以及诸如此类,您可能能够识别该常量的用法。但唉,这没有用。因为知道某些类使用enum E.y根本不会告诉你如何操作该类,所以你可以安全地删除E.y!

另一方面,您假设此更改将导致大型应用程序以某种方式避免不需要的行为。结论:似乎有很多这种常数的用法。您认为代码将来应该怎么做?当然,切换案例不再执行了。但是那些将常量作为参数传递的方法调用呢?!更糟糕的是:那些使用ordinal()方法和特定枚举的“聪明”的人,或者反射(用来自上帝的原始字符串创建枚举常量的人知道)怎么样?

长话短说:从理论上讲,你可以轻松地降低枚举常数。但最有可能的是,这样做的结果将无法可靠地发挥作用。

相反:退一步。不要在类和heck枚举常量方面看你的应用程序。考虑其功能和模块,而不是确定哪个“整个组件”可以从该系统内/在该系统内安全地切割/替换。

© www.soinside.com 2019 - 2024. All rights reserved.