createController в строке 29 в приведенной ниже трассировке стека имеет clazz.getClasslo
protected Object createController(Injector injector, String controllerClassFullName) {
Class<?> clazz = classLoader.clazzForName(controllerClassFullName);
return injector.getInstance(clazz); //line 29!!!!
}
loadClass online 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. Я думал, что любые дочерние классы должны проходить через тот же загрузчик классов, что и родительский для загрузки?
(Я пытаюсь исправить это, так как по какой-то причине в CompilingClassLoader отсутствует загрузка этого класса, что вызывает очень забавную ситуацию, например существование ДВУХ объектов DataApi.class, загруженных разными загрузчиками классов).
Хммм, копаясь дальше, я обнаружил, что могу вызывать clazz.getMethods(), НО когда я вызываю clazz.getDeclaredConstructors(), я получаю ClassCircularityError. Самое смешное, что ни CustomerController, ни DataClientProxy никого не расширяют, так что это действительно странно.
Дин
dataApiObj1.getClass().equals(dataApiObj2.getClass())
, ноdataApiObj1.getClass() != dataApiObj2.getClass()
- person Bohemian♦   schedule 29.05.2020