8

想象一下,我有两个 A 和 B 类,B 扩展 A,比如

class B extends A
{
  ....
}

但是,在我的情况下,A 类是加密的,只能由我的 ClassLoader 在运行时加载(在编译时,A.class 不能被识别为 .class 文件,因为它是加密的)。这意味着 A 类在编译时不存在。

我的问题是:

  1. 由于某些方法会覆盖 A 类中的方法,如何为 B 类编写代码?
  2. 如何在运行时指定 B 类扩展到 A 类?
4

2 回答 2

8

你不能用反思。但是你可以用CGLIB或者javassist

于 2011-05-01T10:09:45.357 回答
3

您可以创建 A 的虚拟副本,其中包含您想要覆盖的所有方法,并且只编译和部署 B。

如果在运行时之前不知道要覆盖哪些方法,则需要使用 Compiler API 生成代码,但是像 Objectweb 的 ASM 这样的库可能要简单得多。我更喜欢 ASM,因为它可以轻松生成代码以从模板中生成您想要的内容。即您不必自己编写所有代码。

于 2011-05-01T11:13:58.633 回答