MCPcopy Create free account
hub / github.com/e2wugui/zeze / HotModule

Class HotModule

ZezeJava/ZezeJava/src/main/java/Zeze/Hot/HotModule.java:20–202  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

18// 1. 目录是一个模块目录时,开启一个新的热更单位;
19// 2. 目录不是模块目录时,它就属于往上级目录方向的最近的热更模块。
20public 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

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected