是否可以定义一个Java ClassLoader,以将完全不同的类返回到所请求的类?

时间:2020-03-06 14:38:31  来源:igfitidea点击:

我已经尝试过了,但是在调用时得到了ClassNotFoundException:

Class.forName("com.AClass", false, mySpecialLoader)

解决方案

ClassLoader将必须调用defineClass来获取Class。根据JavaDoc的defineClass:

If name is not null, it must be equal
  to the binary name of the class
  specified by the byte array.

如果名称为null,它将从字节码中获取它。因此,只要名称为com.AClass,就可以返回任何所需的类。换句话说,我们可能具有com.AClass的多个版本。我们甚至可以使用JavaAssist之类的东西来动态创建一个类。

但这并不能解释ClassNotFoundException,这听起来像类加载器未返回任何内容。

返回与所请求的类不同名称的类是不可能的。但是,可以使用诸如ASM之类的字节码操作工具来自动重命名要返回的类。