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