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