gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:51:26 26 4
gpt4 key购买 nike

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

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

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

最佳答案

最有可能:不可能。

but I am unable to re-generate from source

换句话说:你不能将其编译为“项目”。因此,您缺乏此类项目定义附带的基本工具(例如:轻松访问“用法”,以及轻松重构)。

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

但最大的缺点是:您知道有多少其他类正在使用该特定常量。也许,使用 javap 和 grep 等,您可能能够识别该常量的用法。但可惜的是,这没有帮助。因为知道某个类使用枚举 E.y 根本不会告诉您如何必须操作该类才能安全地删除 E.y!

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

长话短说:当然,理论上,您可以轻松删除枚举常量。但这样做的结果很可能无法可靠地工作。

相反:退后一步。不要根据类和枚举常量来看待您的应用程序。考虑它的功能和模块,而是确定可以从该系统中/在该系统内安全地剪切/替换哪些“整个组件”。

关于java - 我可以从 Java 类文件中删除枚举值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55892583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com