如何从类名创建类对象,并将其用于方法重载

时间:2014-09-01 08:15:36

标签: java reflection

要解释问题,请考虑我有6个班级

  1. ClassOne
  2. ClassTwo
  3. ClassThree
  4. ClassFour
  5. ClassFive
  6. ClassImpl
  7. 我有方法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动态包含不同类别的名称我不想硬编码任何内容,因为某些类可能会添加到项目中,或者某些类可能会被删除我只想添加或删除相应的{{ 1}}方法何时发生。

2 个答案:

答案 0 :(得分:1)

一种方法是对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的重载进行了硬编码,我想这个解决方案可以适合您的实现。

另一种方法是使用反射来调用适当的方法:

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); 
    }
}

答案 1 :(得分: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);                            
}