Чтобы объяснить проблему, у меня есть 6 классов
У меня есть метод startOperation(List<String> classNameList)
, в этом методе я classNameList
и для каждого имени класса я использую отражение, чтобы получить объект этого класса, теперь я хочу вызвать метод doOperation()
который является перегруженным методом.
private void doOperation(ClassOne objClassOne) {
//Do somethig
}
private void doOperation(ClassTwo objClassTwo) {
//Do somethig
}
.. And so on up to
private void doOperation(ClassFive objClassFive) {
//Do somethig
}
мой метод startOperation
выглядит так:
public void startOperation(List<string> classNameList) {
for (String string : classNameList) {
Class actualClass = Class.forName(className);
Object classObj = actualClass.newInstance();
doOperation(classObj); // here I am getting problem
}
}
сообщите, как вызвать перегруженный метод из цикла.
Примечание: classNameList
динамически содержит имена разных классов. Я не хочу ничего жестко кодировать, поскольку некоторые классы могут быть добавлены в проект или некоторые могут быть удалены. Я просто хочу добавить или удалить соответствующий метод doOperation
когда это произойдет.
Вы можете сделать это с отражением:
for (String string : classNameList) {
Class actualClass = Class.forName(className);
Object classObj = actualClass.newInstance();
Method doOp = this.getClass().getDeclaredMethod("doOperation", actualClass);
doOp.setAccessible(true);
doOp.invoke(this, classObj);
}
Один из способов - жестко classObj
проверку типа classObj
:
private void doOperation(final Object objClass)
{
if(objClass instanceof ClassOne)
doOperation((ClassOne)o);
else if(objClass instanceof ClassTwo)
doOperation((ClassTwo)o);
else if(objClass instanceof ClassThree)
doOperation((ClassThree)o);
else if(objClass instanceof ClassFour)
doOperation((ClassFour)o);
else if(objClass instanceof ClassFive)
doOperation((ClassFive)o);
}
Поскольку у вас уже есть doOperation
перегрузки doOperation
я думаю, это решение может соответствовать вашей реализации.
Другой способ - использовать рефлексию для вызова соответствующего метода:
public void startOperation(List<String> classNameList)
{
for (String string : classNameList)
{
Class actualClass = Class.forName(className);
Object classObj = actualClass.newInstance();
Method doOperation = ClassImpl.class.getDeclaredMethod("doOperation", actualClass);
doOperation.setAccessible(true);//doOperation is private, we need to bypass that
doOperation.invoke(this, classObj);
}
}
doOperation
частью класса ClassImpl
?