CompilingClassLoader весело, есть идеи, как дочерний класс загружается из другого загрузчика классов в этом случае? - PullRequest
0 голосов
/ 29 мая 2020

createController в строке 29 в приведенной ниже трассировке стека имеет clazz.getClasslo

protected Object createController(Injector injector, String controllerClassFullName) {
    Class<?> clazz = classLoader.clazzForName(controllerClassFullName);
    return injector.getInstance(clazz); //line 29!!!!
}

loadClass в сети 521 загружает класс конструктора указанной выше переменной clazz, НО не загружается из CompilingClassLoader. Он как-то его пропускает. У конструктора есть ТРИ параметра, все загружаемые из CompilingClassLoader, кроме последнего: (

Вот конструктор, о котором я говорю (вы можете видеть, что он вызывает getDeclaredConstructors в трассировке стека)

@Inject
public CustomerController(
        HashCreator hashCreator,
        TokenGenerator tokenGenerator,
        DataClientProxy clientProxy
) {
    this.hashCreator = hashCreator;
    this.tokenGenerator = tokenGenerator;
    this.clientProxy = clientProxy;
}

Наконец, вот трассировка стека

loadClass:521, ClassLoader (java.lang)
getDeclaredConstructors0:-1, Class (java.lang)
privateGetDeclaredConstructors:3137, Class (java.lang)
getDeclaredConstructors:2357, Class (java.lang)
forConstructorOf:245, InjectionPoint (com.google.inject.spi)
create:115, ConstructorBindingImpl (com.google.inject.internal)
createUninitializedBinding:706, InjectorImpl (com.google.inject.internal)
createJustInTimeBinding:930, InjectorImpl (com.google.inject.internal)
createJustInTimeBindingRecursive:852, InjectorImpl (com.google.inject.internal)
getJustInTimeBinding:291, InjectorImpl (com.google.inject.internal)
getBindingOrThrow:222, InjectorImpl (com.google.inject.internal)
getProviderOrThrow:1040, InjectorImpl (com.google.inject.internal)
getProvider:1071, InjectorImpl (com.google.inject.internal)
getProvider:1034, InjectorImpl (com.google.inject.internal)
getInstance:1086, InjectorImpl (com.google.inject.internal)
createController:29, DevLoader (org.webpieces.devrouter.impl)

Как в мире первые два параметра загружаются из CompilingClassLoader, а третий конструктор загружается из обычного ClassLoader. Я думал, что любые дочерние классы должны go через тот же загрузчик классов, что и родительский для загрузки?

(я пытаюсь исправить это, поскольку по какой-то причине CompilingClassLoader не загружает этот класс, что вызывает очень забавное существование ДВУХ объектов DataApi.class, загруженных разными загрузчиками классов ).

Хммм, копая дальше, я обнаружил, что могу вызвать clazz.getMethods (), НО когда я вызываю clazz.getDeclaredConstructors (), я получаю ClassCircularityError. Настоящая забавная вещь - это CustomerController или DataClientProxy продлить кого угодно, так что это действительно мы ird.

Дин

1 Ответ

0 голосов
/ 29 мая 2020

Гадость. Итак, у файла неправильное имя пакета. В то время как eclipse не допускает этого, и intellij помечает его как красный, gradle и java позволяют ему компилироваться нормально, но когда мы ищем источник, мы не можем найти источник, поэтому мы не можем загрузить его через CompilingClassLoader вызывает очень запутанную проблему. Я даже не могу создать исключение из этого эффекта, сообщив разработчику, что пакет неверен, потому что я получаю только имена классов и не знаю, неверно ли имя пакета или нет, поскольку все классы go через этот загрузчик классов. ick.

...