Динамическое преобразование java-объекта класса Object в данный класс, когда имя класса известно
Да, я знаю. Длительное название вопроса... Итак, у меня есть имя класса в строке. Я динамически создаю объект этого класса следующим образом:
String className = "com.package.MyClass";
Class c = Class.forName(className);
Object obj = c.newInstance();
Как я могу динамически преобразовать этот объект obj в MyClass? Я не могу написать так:
MyClass mobj = (MyClass)obj;
... потому что className может быть другим.
Ответы
Ответ 1
вы не объявляете интерфейс, который объявляет методы, которые вы хотите вызвать:
public interface MyInterface
{
void doStuff();
}
public class MyClass implements MyInterface
{
public void doStuff()
{
System.Console.Writeln("done!");
}
}
то вы используете
MyInterface mobj = (myInterface)obj;
mobj.doStuff();
Если MyClass
не находится под вашим контролем, вы не можете заставить его реализовать какой-либо интерфейс, а другой вариант - полагаться на отражение (видеть это учебник).
Ответ 2
Я думаю, что его довольно прямолинейно с отражением
MyClass mobj = MyClass.class.cast(obj);
и если имя класса отличается
Object newObj = Class.forName(classname).cast(obj);
Ответ 3
Вам не нужно преобразовывать объект в объект MyClass, потому что он уже есть. Wnat, который вы действительно хотите сделать, это бросить его, но поскольку имя класса неизвестно во время компиляции, вы не можете этого сделать, поскольку вы не можете объявить переменную этого класса. Я предполагаю, что вам нужно/нужно что-то вроде "утиной печати", т.е. Вы не знаете имя класса, но знаете имя метода во время компиляции. Интерфейсы, предложенные Грегори, являются вашим лучшим выбором для этого.
Ответ 4
Если вы не знали, что mojb
имеет тип MyClass
, то как вы можете создать эту переменную?
Если MyClass является типом интерфейса или супер-типом, тогда нет необходимости делать приведение.