Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从类名创建类对象并将其用于方法重载 为了解释问题,我认为有6个类 一级 二班 三班 四班 第五班 ClassImpl_Java_Reflection - Fatal编程技术网

Java 如何从类名创建类对象并将其用于方法重载 为了解释问题,我认为有6个类 一级 二班 三班 四班 第五班 ClassImpl

Java 如何从类名创建类对象并将其用于方法重载 为了解释问题,我认为有6个类 一级 二班 三班 四班 第五班 ClassImpl,java,reflection,Java,Reflection,我有一个方法startoOperation(List classNameList),在这个方法中,我迭代classNameList,对于每个类名,我使用反射来获取该类的对象,现在我想调用方法doOperation(),这是一个重载方法 private void doOperation(ClassOne objClassOne) { //Do somethig } private void doOperation(ClassTwo objClassTwo) { //Do some

我有一个方法
startoOperation(List 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                             
    }
}
公共作废开始操作(列表类名称列表){
for(字符串:classNameList){
Class actualClass=Class.forName(className);
Object classObj=actualClass.newInstance();
doOperation(classObj);//我遇到了问题
}
}
请说明如何从循环中调用重载方法


注意:
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
的类型检查进行硬编码:

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); 
    }
}
公共作废开始操作(列表类名称列表)
{
for(字符串:classNameList)
{
Class actualClass=Class.forName(className);
Object classObj=actualClass.newInstance();

方法doOperation=ClassImpl.class.getDeclaredMethod(“doOperation”,actualClass); setAccessible(true);//doOperation是私有的,我们需要绕过它 调用(this,classObj); } }
您遇到了什么问题?请告诉我们您遇到的具体错误,因为没有这样的方法例外我猜无法像这样检索私有方法,因为我已经使用这个.getClass().getMethods()进行了检查,它返回了所有公共方法method doOperation=ClassImpl.class.getDeclaredMethod(“doOperation”,actualClass); 此时获取错误NoSuchMethod,因此doOperation.setAccessible(true);未被执行是类
ClassImpl
的一部分吗?