Как создать объект класса из имени класса и использовать его для перегрузки метода

1

Чтобы объяснить проблему, у меня есть 6 классов

  1. ClassOne
  2. ClassTwo
  3. ClassThree
  4. ClassFour
  5. ClassFive
  6. ClassImpl

У меня есть метод 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 когда это произойдет.

  • 0
    какая проблема у тебя?
  • 0
    пожалуйста, покажите нам конкретную ошибку, которую вы получаете
Теги:
reflection

2 ответа

0
Лучший ответ

Вы можете сделать это с отражением:

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);                            
}
  • 0
    это дает исключение noSuchMethod
  • 0
    я думаю, что приватный метод не может быть получен, как это, потому что я проверил, используя this.getClass (). getMethods (), который возвратил все открытые методы
Показать ещё 1 комментарий
1

Один из способов - жестко 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); 
    }
}
  • 0
    Метод doOperation = ClassImpl.class.getDeclaredMethod ("doOperation", actualClass); в этот момент происходит ошибка NoSuchMethod, найденная, следовательно, doOperation.setAccessible (true); не выполняется
  • 0
    Являются ли методы doOperation частью класса ClassImpl ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню