Я пытаюсь сослаться на объект, загруженный через загрузчик классов, в классе, который загружен другим загрузчиком классов.Мне нужно выполнить приведение этого объекта для доступа к некоторым методам.Мне нужен способ сделать это, избегая другого загрузчика классов.Я знаю , что мы не можем разыгрывать классы разных загрузчиков классов, и это не , что мне нужно здесь.Мне нужно выполнить приведение в том же загрузчике классов, избегая другого загрузчика классов, который загрузил тот же класс.Это оказалось действительно сложно.
Вот небольшой контекст.Как видно из приведенных ниже классов, я получаю объект в методе MyClass.configure () через метод ComponentResolver.lookup (), который является экземпляром Mojo, но приведен к Object.
К сожалению, Mojo mojo = clazz.cast(o)
(в MyClass ниже) завершается с ошибкой компиляции, говоря, что возвращаемый тип clazz.cast - Object.Может кто-нибудь сказать мне, как решить эту проблему?Может быть, с помощью того же метода класса # или с помощью отражения?Я не очень хорошо знаком с отражением!
//This is loaded by, say ClassLoader X
public class ComponentResolver {
public Object lookup(String role) {
//do something
return component; //component is an instance of Mojo interface.
}
}
Вот MyClass, где я вызываю метод поиска.
//This class including Mojo in this context is loaded by, say ClassLoader Y
public class MyClass {
public void configure() {
Object o = componentResolver.lookup("componentName");
// Mojo mojo = (Mojo) o; //causes classcastexception (obviously.)
Class<?> clazz = Class.forName("org.Mojo", false,
o.getClassLoader() );
Mojo mojo = clazz.cast(o);
//Causes compiler errors because the returned object is of type Object.
//ie incompatible types Required:Mojo, Found:Object
// Mojo mojo = (Mojo) clazz.cast(o); //again classcastexception.
mojo.execute();
}
}