是否可以定义一个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之类的字节码操作工具来自动重命名要返回的类。