gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:32 24 4
gpt4 key购买 nike

为了解释问题,考虑我有 6 个类(class)

  1. 一级
  2. 第二类
  3. 第三类
  4. 第四类
  5. 五级
  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发生这种情况时的方法。

最佳答案

一种方法是对 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);
}
}

关于java - 如何从类名创建类对象并将其用于方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25601539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com