【问题标题】:Is it possible to define a Java ClassLoader that returns completely different classes to the one's requested?是否可以定义一个 Java 类加载器,将完全不同的类返回给所请求的类?
【发布时间】:2026-02-02 08:00:02
【问题描述】:

我试过这个,但是调用时得到一个 ClassNotFoundException:

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

【问题讨论】:

  • 你能详细说明一下吗?
  • 需要更多信息。您可能会因为很多原因而找不到类...
  • 对不起,不知道 cmets!我扩展了 ClassLoader,并覆盖了 loadClass(String, boolean)。基本上,在特殊情况下它只是返回一个现有的 Class> 对象。

标签: java reflection classloader


【解决方案1】:

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

如果name不为null,则必须相等 到类的二进制名称 由字节数组指定。

如果名称为空,它将从字节码中获取。所以你可以返回任何你想要的类,只要它被称为 com.AClass。换句话说,您可以拥有多个版本的 com.AClass。您甚至可以使用 JavaAssist 之类的工具来动态创建类。

但这并不能解释 ClassNotFoundException - 听起来您的类加载器没有返回任何内容。

【讨论】:

    【解决方案2】:

    不可能返回一个名称与请求名称不同的类。但是,可以使用 ASM 之类的字节码操作工具自动将您想要返回的类重命名为请求的类。

    【讨论】:

      最近更新 更多