получить CtClass, используя указанный c ClassLoader - PullRequest
1 голос
/ 21 марта 2020

У меня есть такая структура классов:

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

Теперь я могу получить CtClass внутреннего класса, используя:

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

Проблема возникает, если эти классы загружаются специальным ClassLoader.

ClassPool#getCtClass не удается, потому что ClassLoader, который он использует, не знает о классе.

Я получаю следующее исключение:

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>

Как указать ClassLoader для ClassPool#getCtClass? Можно ли как-то установить загрузчик классов из ClassPool? Я заметил, что есть метод getClassLoader(), но, похоже, нет сеттера.

1 Ответ

1 голос
/ 21 марта 2020

ClassPool поддерживает вставку, добавление и удаление ClassPath s. ClassPath может быть вставлен и добавлен в форме реализации String или ClassPath. Удаление поддерживается только в форме ClassPath.

Существует 4 предоставленных реализации ClassPath:

  1. ByteArrayClassPath: укажите байт-код и имя класса
  2. ClassClassPath : Укажите Java class
  3. LoaderClassPath: укажите загрузчик классов
  4. URLClassPath: укажите URL
...