如何在Java中加载修改后的超类?

A.D*_*HEL 5 java classloader superclass java-bytecode-asm

  • 我的班级A延伸到B。
  • 我创建了一个CustomClassLoader,扩展了ClassLoader来使用defineClass(className, byte[], offset, length)
  • 我已经实例化了new CustomClassLoader(Thread.currentThread().getContextClassLoader())。因此,CustomClassLoader的父级是当前线程中的ClassLoader。
  • 我已经使用ASM框架修改了B类。我已经在.class文件中编写了修改后的类,并使用反编译器来确保它可以工作。而且有效。
  • 我已将修改后的B类添加到CustomClassLoader中
  • 我已经Thread.currentThread().setContextClassLoader()用CustomClassLoader 设置了。
  • 我使用过负载A Class.forName(String, true, the CustomClassLoader)
  • 但是加载的B类似乎是原始类。

我怎么了?如果您需要更多信息,请在我的GitHub上找到详细的主题。

Erw*_*idt 2

Java 类加载器首先搜索父类加载器,然后再查找子类加载器。

ClassLoader 中的 loadClass 方法在调用加载类时按顺序执行以下任务:

  1. 如果一个类已经被加载,它就会返回它。
  2. 否则,它将对新类的搜索委托给父类加载器。
  3. 如果父类加载器没有找到该类,loadClass会调用findClass方法来查找并加载该类。

了解扩展类加载- Oracle)

如果您想更改该顺序,则还需要重写该loadClass方法,但有很多注意事项,除非您非常了解类加载,否则不建议这样做。

  • 更简单的选择是确保父类加载器找不到原始类B