使用特定的 ClassLoader 获取 CtClass

get CtClass using specific ClassLoader

我有这样的 class 结构:

package com.mydomain.myproject;
public class Outer{
    public class Inner{
        //some code
    }
}

现在,我可以使用以下方法获得内部 class 的 CtClass

ClassPool pool=ClassPool.getDefault();
CtClass innerCt=pool.getCtClass("com.mydomain.myproject.Outer$Inner");

如果这些 class 是由特殊的 ClassLoader 加载的,就会出现问题。

ClassPool#getCtClass 失败,因为它使用的 ClassLoader 不知道 class.

我得到以下异常:

javassist.NotFoundException: io.github.jdiscordbots.nightdream.commands.Eval$Sandbox
    at javassist.ClassPool.get(ClassPool.java:430)
    at javassist.ClassPool.getCtClass(ClassPool.java:495)
    at <my classes>

如何为 ClassPool#getCtClass 指定 ClassLoader?我能以某种方式设置 ClassPool 的 class 加载器吗?我注意到有一个 getClassLoader() 方法,但似乎没有 setter.

ClassPool supports inserting, appending and removing ClassPath秒。 可以以 String 或 ClassPath 实现的形式插入和添加 ClassPath。仅支持以类路径的形式删除。

提供了 4 个 ClassPath 实现:

  1. ByteArrayClassPath:提供字节码和class名称
  2. ClassClassPath: 提供 Java class
  3. LoaderClassPath:提供一个 classloader
  4. URLClassPath:提供一个URL