面试题答案
一键面试实现思路
- 定义插件接口和插件类:首先需要定义不同类型插件实现的接口,每个插件类实现这些接口,并包含一个唯一标识字段。
- 注册插件:在系统启动时,将所有插件类的信息注册到一个映射表中,映射表的键为插件的唯一标识,值为对应的插件类的
Class
对象。 - 通过反射获取实例并调用方法:当需要根据唯一标识获取插件实例并调用特定接口方法时,从映射表中获取对应的
Class
对象,使用反射创建实例,然后根据需要调用其接口方法。
关键代码示例
以下以Java语言为例:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
// 定义插件接口
interface PluginInterface {
void specificMethod();
}
// 插件A实现类
class PluginA implements PluginInterface {
private final String id = "pluginA";
@Override
public void specificMethod() {
System.out.println("PluginA's specific method");
}
}
// 插件B实现类
class PluginB implements PluginInterface {
private final String id = "pluginB";
@Override
public void specificMethod() {
System.out.println("PluginB's specific method");
}
}
public class PluginManager {
private static final Map<String, Class<? extends PluginInterface>> pluginRegistry = new HashMap<>();
// 注册插件
static {
pluginRegistry.put("pluginA", PluginA.class);
pluginRegistry.put("pluginB", PluginB.class);
}
// 根据唯一标识获取插件实例并调用方法
public static void executePlugin(String id) {
Class<? extends PluginInterface> pluginClass = pluginRegistry.get(id);
if (pluginClass != null) {
try {
Constructor<? extends PluginInterface> constructor = pluginClass.getConstructor();
PluginInterface plugin = constructor.newInstance();
plugin.specificMethod();
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
} else {
System.out.println("Plugin with id " + id + " not found.");
}
}
public static void main(String[] args) {
executePlugin("pluginA");
executePlugin("pluginC");
}
}
上述代码中:
- 定义了
PluginInterface
接口,插件类PluginA
和PluginB
实现了该接口。 PluginManager
类中的pluginRegistry
用于注册插件类信息。executePlugin
方法通过反射根据唯一标识获取插件实例并调用其specificMethod
方法。main
方法演示了如何调用该功能。