Пожалуйста, помогите мне решить эту проблему. Спасибо!
Я работаю над проектом Grails-5.2.4 с Java 1.8. Загрузчик классов не работает должным образом.
Я получаю исключение приведения класса для следующего фрагмента кода.
def index() {
Profile profile = getClass().classLoader.loadClass("centaur.demo.Profile") as Profile
}
Ниже приведены сведения об исключении:
Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'class centaur.demo.Profile' with class 'java.lang.Class' to class 'centaur.demo.Profile'
at org.grails.web.converters.ConverterUtil.invokeOriginalAsTypeMethod(ConverterUtil.java:147)
at org.grails.web.converters.ConvertersExtension.asType(ConvertersExtension.groovy:56)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at centaur.demo.IndexController.index(IndexController.groovy:10)
... 13 common frames omitted
Ожидаемое поведение:
Строка ниже должна возвращать объект класса Profile.
getClass().classLoader.loadClass("centaur.demo.Profile")
Это отлично работает с Grails 3.3.9.
Как следует из названия, ClassLoader#loadClass возвращает экземпляр java.lang.Class
. Вы должны создать экземпляр класса, чтобы получить объект его ссылочного типа, используя new Profile(...)
или вызвав Class#newInstance в результате loadClass
(при условии, что ваш класс Profile имеет доступный конструктор по умолчанию)
эта строка:
getClass().classLoader.loadClass("centaur.demo.Profile")
должен вернуть вам объект Class
.
ознакомьтесь с документацией: https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#loadClass-java.lang.String-
поэтому вы можете присвоить результат классу:
Class c = getClass().classLoader.loadClass("centaur.demo.Profile")
вы можете создать экземпляр класса:
def profile = getClass().classLoader.loadClass("centaur.demo.Profile").newInstance()
но следующий код может завершиться ошибкой:
centaur.demo.Profile profile = getClass().classLoader.loadClass("centaur.demo.Profile").newInstance()
когда загрузчик классов, используемый для объявления, отличается от возвращаемого getClass().classLoader
Привет @daggett, что, если я не хочу создавать новый экземпляр, а загружать существующую запись из БД?
Не могу понять, как вопрос связан с загрузкой записи из БД..
На самом деле, я столкнулся с проблемой, подобной этой, когда данные извлекаются из базы данных. Не могли бы вы дать мне свой адрес электронной почты/скайп и т. д., чтобы поделиться подробностями? Если ты сможешь это исправить, я заплачу тебе за это. Платное задание. Спасибо!
Спасибо, Флориан, ты очень хорошо объяснил.