| 18 | // 1. 目录是一个模块目录时,开启一个新的热更单位; |
| 19 | // 2. 目录不是模块目录时,它就属于往上级目录方向的最近的热更模块。 |
| 20 | public class HotModule extends ClassLoader implements Closeable { |
| 21 | private static final Logger logger = LogManager.getLogger(HotModule.class); |
| 22 | private final File jarFile; |
| 23 | private JarFile jar; // 模块的class(interface除外)必须打包成一个jar,只支持一个。 |
| 24 | private final Class<?> moduleClass; |
| 25 | private HotService service; |
| 26 | private final boolean isLoadSchemas; |
| 27 | |
| 28 | // 每个版本的接口一个上下文。 |
| 29 | private final ConcurrentHashMap<Class<?>, HotModuleContext<?>> contexts = new ConcurrentHashMap<>(); |
| 30 | public final ConcurrentHashSet<Action1<HotModule>> stopEvents = new ConcurrentHashSet<>(); |
| 31 | |
| 32 | // 为了支持批量装载redirect.class,构造只初始化moduleClass,service下一步处理。 |
| 33 | public HotModule(HotManager parent, String namespace, File jarFile) throws Exception { |
| 34 | super(namespace, parent); |
| 35 | this.jarFile = jarFile; |
| 36 | this.jar = new JarFile(jarFile); |
| 37 | // App.ModuleClassName:MySolution.MyName.ModuleMyName,namespace=MySolution.MyName |
| 38 | // MyName 一般就叫模块名字。 |
| 39 | var moduleClassName = namespace + ".Module" + last(namespace); |
| 40 | this.moduleClass = loadClass(moduleClassName); |
| 41 | this.isLoadSchemas = false; |
| 42 | } |
| 43 | |
| 44 | // 用于装载 Schemas. 借用这个类实现单独的装载。 |
| 45 | HotModule(File jarFile) throws Exception { |
| 46 | this.jarFile = jarFile; |
| 47 | this.jar = new JarFile(jarFile); |
| 48 | this.moduleClass = null; |
| 49 | this.isLoadSchemas = true; |
| 50 | } |
| 51 | |
| 52 | public String getJarFileName() { |
| 53 | return jar.getName(); |
| 54 | } |
| 55 | |
| 56 | JarFile getJarFile() { |
| 57 | return jar; |
| 58 | } |
| 59 | |
| 60 | Class<?> getModuleClass() { |
| 61 | return moduleClass; |
| 62 | } |
| 63 | |
| 64 | void setService(IModule service) { |
| 65 | this.service = (HotService)service; |
| 66 | } |
| 67 | |
| 68 | private static String last(String namespace) { |
| 69 | var ns = namespace.split("\\."); |
| 70 | return ns[ns.length - 1]; |
| 71 | } |
| 72 | |
| 73 | @SuppressWarnings("unchecked") |
| 74 | public <T extends HotService> HotModuleContext<T> getContext(Class<T> serviceClass) { |
| 75 | return (HotModuleContext<T>)contexts.computeIfAbsent(serviceClass, (key) -> new HotModuleContext<T>(this)); |
| 76 | } |
| 77 |
nothing calls this directly
no outgoing calls
no test coverage detected