可以添加一个新的 class 可以转换为现有的最终 class 吗?
Possible to add a new class that can be cast to an existing final class?
我在库中定义了 class 个:
public final class A {blah}
然后我想在某个地方使用新的 class B 来替换它:
A a = new A();
A a = (A) new B();
B有A中的所有方法和成员,所以这样做其实是安全的,我用C++也可以。但是对于 Java,此转换将导致异常。那么在 Java 中是否有任何解决方法或黑客来做到这一点?
另外,有没有不接触虚拟机的破解方法?
尽管 B
拥有所有方法并且 属性 和 A
拥有,但您不能将 B
的对象转换为 A
的引用。这意味着 -
A a = (A) new B();
无效,除非 B
扩展 A
.
这里 A
是最终的 class,因此您不能将 A
扩展为 B
。您必须使 A
非最终且 B 必须扩展 A。然后上面的转换将有效。
Java 的 final
关键字的存在是为了防止子类化,所以简单的答案是 否 。您可以使用 PowerMock 之类的东西来做这种事情。不过,我不会在测试之外这样做。
这是不可能的,因为你的 class A 是最终的。最终的 class 只是一个无法扩展的 class。
我在库中定义了 class 个:
public final class A {blah}
然后我想在某个地方使用新的 class B 来替换它:
A a = new A();
A a = (A) new B();
B有A中的所有方法和成员,所以这样做其实是安全的,我用C++也可以。但是对于 Java,此转换将导致异常。那么在 Java 中是否有任何解决方法或黑客来做到这一点? 另外,有没有不接触虚拟机的破解方法?
尽管 B
拥有所有方法并且 属性 和 A
拥有,但您不能将 B
的对象转换为 A
的引用。这意味着 -
A a = (A) new B();
无效,除非 B
扩展 A
.
这里 A
是最终的 class,因此您不能将 A
扩展为 B
。您必须使 A
非最终且 B 必须扩展 A。然后上面的转换将有效。
Java 的 final
关键字的存在是为了防止子类化,所以简单的答案是 否 。您可以使用 PowerMock 之类的东西来做这种事情。不过,我不会在测试之外这样做。
这是不可能的,因为你的 class A 是最终的。最终的 class 只是一个无法扩展的 class。