Могу ли я сослаться на класс по строковому имени?
У меня есть список утилит, которые получены из:
abstract public class BaseUtil implements Callable{
public String name;
public StreamWrapper data;
public void setData(StreamWrapper stream){ this.data = stream; }
private static Class me = BaseUtil.class;
private static Method[] availableUtilities = me.getDeclaredMethods();
public static Method[] getUtilities(){ return availableUtilities; }
}
Я хочу, чтобы на каждом узле была возможность назначить ему утилиту, что-то вроде:
Initialize(String utilName){
activeUtility = utilName;
gk = new GateKeeper(BaseUtil.getUtilities() <something>);
}
public class GateKeeper {
GateKeeper(BaseUtil util) {
this.util = util;
}
private BaseUtil util;
Но я не уверен, как получить конкретный служебный класс только из передаваемой строки. Пример утилиты:
public class WordLengthUtil extends BaseUtil {
private String name = "WordLength";
public Integer call() {
System.out.println(this.data);
return Integer.valueOf(this.data.length());
}
}
1 ответ
Вы можете использовать отражение:
String name = "WordLength";
String className = hashMap.get(name);
Callable plugin = (Callable) Class.forName(className).newInstance();
используйте HashMap для хранения привязки между className и строковым идентификатором