要解释问题,请考虑我有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
动态包含不同类别的名称我不想硬编码任何内容,因为某些类可能会添加到项目中,或者某些类可能会被删除我只想添加或删除相应的{{ 1}}方法何时发生。
答案 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);
}