Java 在名称由字符串变量定义的类中调用已知函数(带参数)

Java 在名称由字符串变量定义的类中调用已知函数(带参数),java,function,class,variables,Java,Function,Class,Variables,我有一系列不同名称的类,每个类都有一个performLogic函数,可以接受许多预设参数(始终相同): 我想要一种方式,我可以这样称呼它: String actionName = "DoSomeAction"; actionName.performLogic(param1, param2...); 希望这是清楚的我想做什么 感谢您的反馈,并将我引向课堂。forName() 经过进一步研究,我能够实现以下目标: try { Class actionClass = Class.forNam

我有一系列不同名称的类,每个类都有一个performLogic函数,可以接受许多预设参数(始终相同):

我想要一种方式,我可以这样称呼它:

String actionName = "DoSomeAction";
actionName.performLogic(param1, param2...);
希望这是清楚的我想做什么

感谢您的反馈,并将我引向课堂。forName() 经过进一步研究,我能够实现以下目标:

try {
    Class actionClass = Class.forName(blockAction);

    Object obj = actionClass.newInstance();

    Class[] parameterTypes = new Class[2];
    parameterTypes[0] = String.class;
    parameterTypes[1] =  String.class;

    Method performLogic = actionClass.getDeclaredMethod("performLogic", parameterTypes);

    performLogic.invoke(obj, param1, param2);
}
catch(ClassNotFoundException e) {
    cat.error("Class not found: " + e.toString());
}
你可以使用反射

Object action = ???; // perhaps you need .newInstance() for action class
                     // Hopefully you have a interface with performLogic

String methodName = "performLogic";
try {
    Method method = action.getClass().getMethod(methodName, param1.class, param2.class);
    method.invoke(action, param1, param2);
} catch (SecurityException | NoSuchMethodException e) {
    // Error by get Method
} catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {        
    // Error by call Method
}

反思是关键。您可以通过给定的类名(连同包名)实例化一个类并调用该函数。调用Class.forName()后,必须调用该类对象上的.newInstance(),请参见Class.forName(“full.package.Classname”)。将它转换到正确的类后,您将能够调用该函数。
Object action = ???; // perhaps you need .newInstance() for action class
                     // Hopefully you have a interface with performLogic

String methodName = "performLogic";
try {
    Method method = action.getClass().getMethod(methodName, param1.class, param2.class);
    method.invoke(action, param1, param2);
} catch (SecurityException | NoSuchMethodException e) {
    // Error by get Method
} catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {        
    // Error by call Method
}